今天读书读到了一句话,分享给大家:岳飞回则回矣,何必十二道金牌枉催!该做的事就抓紧做,不要拖延。
好啦,进入正题:
C语言的结构类型——可以创建一个自己的复合数据类型。
1.声明结构类型:
struct student_date
{
char name[NAME_LEN + 1];
int age;
int grade;
};//这里的 ; 不要丢掉!!!
这里面的 name、age、grade都是结构student_date的成员。
struct student_date liming; //定义一个变量liming,类型为student_date
strncpy(liming.name,"liming",sizeof(liming.name) - 1);
liming.name[sizeof(liming.name) - 1] = '\0';//其实如果liming.name足够长直接用strcpy就可以了
liming.age = 18;
liming.grade = 1;
注意:
字符数组赋值除了赋初值其他场合不能用=赋值,所以这里用的strcpy/strncpy来给它赋值!
字符指针可以 随时用=赋值!
还可以直接在声明结构时就定义此结构变量(比较常用):
struct student_date
{
char name[NAME_LEN + 1];
int age;
int grade;
}liming,xiaohong,Jane;//这里的 ; 不要丢掉!!!
2.关于结构声明在(主)函数内/外的问题:
1>.结构和本地变量一样,在函数内部声明的结构类型只能在函数内部使用
2>.所以通常在函数外部声明结构类型,这样就可以被多个函数使用了
3.struct无名结构(这种结构我理解为一次性定义结构变量)
struct{
int x;
int y;
}p1,p2;
4.结构可以在初始化时用{}
struct student_date liming = {"liming",18,1};
struct student_date Kangkang = {.name = "Kangkang",.grade = 1};//这里发现少了个age,没有初始化就会认为是0
5.结构成员(可以不是同一种类型,从上面就可以看出来了吧!)
使用运算符 . 来访问结构的成员
6.结构运算
1>要访问整个结构,直接用结构的名字
2>对于整个结构,可以做赋值取地址,也可以传参给函数。
如:
struct student_date
{
char name[NAME_LEN + 1];
int age;
int grade;
}liming;//这里的 ; 不要丢掉!!!
liming = (struct student_date){"liming",18,1};
struct student_date liming2;
liming2 = liming;//赋值。而数组只能在初始化时赋初值,不可以后续做赋值运算 如: a[2] = {3};×
3>结构变量名字不是地址,需要&取地址符
struct student_date *pliming = &liming;
printf("%s\n",(*pliming).name);
这里先是声明了一个指向结构体的指针(结构体指针)
结构体指针可以访问结构体成员:(*point).member;
结构体指针可以作为函数参数(开销小)
7.作为函数参数
比如 int f (struct student_date liming);
1>此时整个结构都会作为参数传入函数,过程就是函数内新建了一个结构变量,并复制了一遍再调用结构的值
2>可以返回一个结构
3>对于结构的输入:
scanf不能一次输入一个结构,但是我们可以自己去写一个my_scanf的函数去读取一个结构,再返回一个结构(不过开销较大)
4>结构体指针作为参数:
对于一种大的结构更加高效的办法就是传指针!(前面说过了无论是传参传入一个结构还是返回一个结构,它都是复制了一个,开销很大)
创建一个结构体指针如下:
struct date{
int month;
int day}myday;
struct date *p = &mydate;
使用结构体指针去修改结构体成员的值:
(*p).month = 12;
p -> month = 12;
这两种形式都是可以的,两者是等价的。( 注:-> 表示指针指向结构变量中的成员)
5>常用的一个小套路:
struct point{
int x;
int y;
};//定义了一个 点 结构(x,y)
struct point* getstruct (struct point *p)//函数getstruct传入的是指针,返回的也是指针
{
scanf("%d",&p->x);
scanf("%d",&p->y);
return p;//返回指针
}
8.结构中的结构
1>
struct point{
int x;
int y;
};//表示一个点(x,y)
struct rectangle{
struct point point1;
struct point point2;
};//左上角一个点右下角一个点足以确定一个矩形(rectangle)
struct rectangle rectangle1;//定义了一个rectangle变量rectangel1
这样去访问时就有了:
rectangle1.point1.x
2>
若
struct rectangle rectangle1,*p_rectangle;//有一个rectangel1,还有一个指针p_rectangle
p_rectangle = &rectangle1;//指针p_r指向r
则 p_rectangle -> point1.x 与 rectangle1.point1,x 与 (p_rectangle->point1).x 三者等价!
3>还有结构中的数组......等等自己去组合吧!
好啦,晚安~~