布局体指针,C语言布局体指针详解亚博提现

布局体指针,可细分为指向布局体变量的指针指向布局体数组的指针
指向布局体变量的指针 前面我们通过“布局体变量名.成员名”的方法引用布局体变量中的成员,除了这种要领之外还可以使用指针。

前面讲过,&student1 暗示布局体变量 student1 的首地点,即 student1 第一个项的地点。假如界说一个指针变量 p 指向这个地点的话,p 就可以指向布局体变量 student1 中的任意一个成员。

那么,这个指针变量界说成什么类型呢?只能界说成布局体类型,且指向什么布局体类型的布局体变量,就要界说成什么样的布局体类型。好比指向 struct STUDENT 类型的布局体变量,那么指针变量就必然要界说成 struct STUDENT* 类型。

下面将前面的措施用指针的方法改削一下: # include <stdio.h> # include <string.h> struct AGE { int year; int month; int day; }; struct STUDENT { char name[20]; //姓名 int num; //学号 struct AGE birthday; //生日 float score; //分数 }; int main(void) { struct STUDENT student1; /*用struct STUDENT布局体类型界说布局体变量student1*/ struct STUDENT *p = NULL; /*界说一个指向struct STUDENT布局体类型的指针变量p*/ p = &student1; /*p指向布局体变量student1的首地点, 即第一个成员的地点*/ strcpy((*p).name, "小明"); //(*p).name等价于student1.name (*p).birthday.year = 1989; (*p).birthday.month = 3; (*p).birthday.day = 29; (*p).num = 1207041; (*p).score = 100; printf("name : %s\n", (*p).name); //(*p).name不能写成p printf("birthday : %d-%d-%d\n", (*p).birthday.year, (*p).birthday.month, (*p).birthday.day); printf("num : %d\n", (*p).num); printf("score : %.1f\n", (*p).score); return 0; } 输出成果是:
name : 小明
birthday : 1989-3-29
num : 1207041
score : 100.0

我们看到,用指针引用布局体变量成员的方法是:

(*指针变量名).成员名

留意,*p 两边的括号不成省略,因为成员运算符“.”的优先级高于指针运算符“*”,所以假如 *p 两边的括号省略的话,那么 *p.num 就等价于 *(p.num) 了。

从该措施也可以看出:因为指针变量 p 指向的是布局体变量 student1 第一个成员的地点,即字符数组 name 的首地点,所以 p 和 (*p).name 是等价的。

但是,“等价”仅仅是说它们暗示的是同一个内存单元的地点,但它们的类型是差此外。指针变量 p 是 struct STUDENT* 型的,亚博新官网,而 (*p).name 是 char* 型的。所以在 strcpy 中不能将 (*p).name 改成 p。用 %s 进行输入或输出时,输入参数或输出参数也只能写成 (*p).name 而不能写成 p。

同样,亚博新官网,虽然 &student1 和 student1.name 暗示的是同一个内存单元的地点,但它们的类型是差此外。&student1 是 struct STUDENT* 型的,而 student1.name 是 char* 型的,所以在对 p 进行初始化时,“p=&student1;”不能写成“p=student1.name”。因为 p 是 struct STUDENT* 型的,所以不能将 char* 型的 student1.name 赋给 p。

别的为了使用的便利和直不雅观,用指针引用布局体变量成员的方法:

(*指针变量名).成员名

可以直接用:

指针变量名->成员名

来取代,它们是等价的。“->”是“指向布局体成员运算符”,它的优先级同布局体成员运算符“.”一样高。p->num 的含义是:指针变量 p 所指向的布局体变量中的 num 成员。p->num 终极代表的就是 num 这个成员中的内容。

下面再将措施用“->”改削一下: # include <stdio.h> # include <string.h> struct AGE { int year; int month; int day; }; struct STUDENT { char name[20]; //姓名 int num; //学号 struct AGE birthday; /*用struct AGE布局体类型界说布局体变量birthday, 生日*/ float score; //分数 }; int main(void) { struct STUDENT student1; /*用struct STUDENT布局体类型界说布局体变量student1*/ struct STUDENT *p = NULL; /*界说struct STUDENT布局体类型的指针变量p*/ p = &student1; /*p指向布局体变量student1的首地点, 即第一项的地点*/ strcpy(p->name, "小明"); p->birthday.year = 1989; p->birthday.month = 3; p->birthday.day = 29; p->num = 1207041; p->score = 100; printf("name : %s\n", p->name); //p->name不能写成p printf("birthday : %d-%d-%d\n", p->birthday.year, p->birthday.month, p->birthday.day); printf("num : %d\n", p->num); printf("score : %.1f\n", p->score); return 0; } 输出成果是:
name : 小明
birthday : 1989-3-29
num : 1207041
score : 100.0

但是要留意的是,只有“指针变量名”后面才华加“->”,千万不要在成员名如 birthday 后面加“->”。
综上所述,以下 3 种形式是等价的:

布局体变量.成员名。

(*指针变量).成员名。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.3158th.com/a/ganhuo/56.html