C语言指针结构体详解,结构体指针,C语言结构体指针详解

结构体指针,可细分为指向结构体变量的指针和指向结构体数组的指针。html

指向结构体变量的指针

前面咱们经过“结构体变量名.成员名”的方式引用结构体变量中的成员,除了这种方法以外还能够使用指针。

前面讲过,&student1 表示结构体变量 student1 的首地址,即 student1 第一个项的地址。若是定义一个指针变量 p 指向这个地址的话,p 就能够指向结构体变量 student1 中的任意一个成员。

那么,这个指针变量定义成什么类型呢?只能定义成结构体类型,且指向什么结构体类型的结构体变量,就要定义成什么样的结构体类型。好比指向 struct STUDENT 类型的结构体变量,那么指针变量就必定要定义成 struct STUDENT* 类型。

下面将前面的程序用指针的方式修改一下:数组

# include # include

structAGE

{intyear;intmonth;intday;

};structSTUDENT

{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

咱们看到,用指针引用结构体变量成员的方式是:spa

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

注意,*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。

此外为了使用的方便和直观,用指针引用结构体变量成员的方式:指针

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

能够直接用:htm

指针变量名->成员名blog

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

下面再将程序用“->”修改一下:内存

# include # include

structAGE

{intyear;intmonth;intday;

};structSTUDENT

{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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值