目录
什么是结构?
想记录抽象物体的一连串数据,我们不想一个一个定义,此时就可以用到C语言的结构类型
一个结构就是一个复合类型,其中可以包含许多不同类型的成员变量
11.2.1 结构类型
struct date {
int month;
int day;
int year;
};
- //struct 是关键字 打括号里面是结构的成员
- // 将来的每一个date里面都有这三个成员
-
#include ‹stdio.h> int main(int arg, char const *argv(]) { struct date { int month; int day; int year; }; struct date today; //使用结构类型,建立了today结构变量 today.month = 07; today. day = 31; today. year = 2014; printf ("Today's date is %i-i-%i.\n" today. year, today.month, today. day| return 0; }
- 和本地变量一样,在函数内部声明的结构类型只能在函数内部使用,但如果在外部声明就可以被多个函数使用了。所以通常将结构声明的部分放在所有函数的外面
- 和之前的枚举相似,使用时候需要带上struct关键字
声明结构的形式
方法一:
- 声明了一个结构名为point,创建了两个变量p1和p2
- 创建了两个变量p1和p2,p1和p2的类型是struct point 【p1和p2里面有x、y的值】
- 接下来就可以使用p1和p2变量做一些事情了
struct point{
int x;
int y;
};
struct point p1,p2;
//声明了一个结构名为point,创建了两个变量p1和p2
方法二:
- //声明了一个结构但没有名字,创建了两个变量p1和p2
- //p1和p2都是无名结构,有x和y值
- //当你只需要在当下使用两个变量,可以用这种不起名字的方式
struct {
int x;
int y;
}p1,p2;
//声明了一个结构但没有名字,创建了两个变量p1和p2
//p1和p2都是无名结构,有x和y值
//当你只需要在当下使用两个变量,可以用这种不起名字的方式
方法三:(常见)
- 声明了一个结构名为point,创建了两个变量p1和p2
- 定义了结构的变量,p1和p2都是point,内部有x和y的值
struct point{
int x;
int y;
}p1,p2;
结构变量
示例:
struct date today;
today.month=06;
today.day=19;
today.year=2005;
- 于是today这个变量中就有三个int类型。函数外声明的部分是在声明一种新类型,而函数内是在定义这种类型的变量。声明后就可以按模板创建多个不同变量,内部含有day、year等等。
结构变量初始化
我们创建一个结构变量之后,它在函数内部,是一个本地变量,没有初始值。因为有前车之鉴,不赋初始值就会给予乱七八糟的内存值。那如何给它赋初值呢?
struct date{
int month;
int day;
int year;
};
int main()
{
struct date today = {07,31,2014};
//一种就是按声明的顺序依次赋值
struct date thismonth = {.month=7, .year=2014 };
//类似数组,没给day赋值,自动赋0
}
结构成员
- 结构成员与数组成员类似,但数组成员类型必须相同,结构成员则不需要
- 成员访问方式不同,数组通过方括号[]和下标(方括号里的数字),而结构通过点(.)和名字来访问
- 注意,出现在【.】的左边的一定是结构变量(实体),结构类型是虚的,只是告诉编译器有这么一个类型
eg:a[0]=10;
today.day\p1.x
结构运算
- 要访问整个结构,直接用结构变量的名字
- 整个结构可以做赋值、取地址,也可以传递给函数参数
- 以下的两种操作,数组都是不能完成的
- day=today;结果是相同的;but!!! 数组不能俩数组直接相等
- 若再更改day、today的值,二者不同,说明这是两个不同的、单独的变量
p1=(struct point){5,10};
//(struct point 是强制类型转换,将5,10强制转换为point结构变量)
//相当于p1.x=5, p1.y=10
p1=p2;
//相当于p1.x = p2.x, p1.y = p2.y
例子:
#include<stdio.h>
struct date{
int month;
int day;
int year;
};
int main()
{
struct date today;
today = (struct date){07,31,2014};
//给today赋值
struct date day;
day=today;//数组不能做相等!!!
//让day=today,分别打印
printf("Today's date is %i-%i-%i.\n",
today.year,today.month,today.day);
printf("The day's date is %i-%i-%i.\n",
today.year,today.month,today.day);
}
结构指针
数组的本质就是指针,但结构变量不是,所以它的名字不能用来当做地址,需要用&运算符。
struct date *pDate = &today
这时创建了一个指针指向了today变量
(养成好习惯,取地址都用&)