结构体这块本来学着没有什么问题的,但是,有时候的学习不知道怎么的,可能是课程进度有点快,会让自己把前面的知识点与现学的联系起来,从而使自己迷惑起来。好了,先说问题:在前面的指针的学习中,我一直过于执着于——*p是以p的值为地址所指向的值,并且*p为一个具体的数值。以至于在学到结构体数组时,比如:pArr为一个结构体数组,pArr[0].age等价于(*pArr).age,我一时脑回路不够用了,困惑于*p是一个值,却忘记了结构指针变量一般形式为:
struct 结构体名 *结构体指针变量名,struct student *pArr = &stu; //假设事先定义了 struct student stu;
所以*pArr实则等价于结构体变量Boy,想到这里,突然明白自己纠结的(*pArr).age其实就是相当于stu.age。(注意(*pArr).age这里的括号不能省,因为"."的运算符优先于"*")有时候理解了后有一种顿悟的感觉,想及时用语言表达出来却也与心里所想有所差距。只可意会不可言传吧,23333~但是说白了也是自己没有彻底的掌握好。
总结一下结构体指针:
- 结构体指针就是指向结构体变量的指针;
- 如果一个指针变量中保存了结构体变量的首地址,那么这个指针变量就指向该结构体变量.
- 通过结构体指针即可访问该结构体变量,这与数组指针和函数指针的情况是相同的
- 结构指针变量说明的一般形式为:struct 结构体名 *结构体指针变量名,例如:struct student *p = &sut; //假设事先定义了 struct student stu;
结构体指针的应用,如果p指向一个结构体变量stu,则以下3种用法等价:
- stu.成员名(如stu.num = 101)
- (*p).成员名(如(*p).num = 101)
- p->成员名(如p->num = 101)
注意:“->” 称为指向,运算符*p等价于结构体变量,所以对于引用结构体变量中的成员用"stu.num = 101;
(*p).num = 101"点引用,对于结构体指针去引用里面的成员用: p->num = 101;
看下面一段代码:
#include <stdio.h>
#include <malloc.h>
struct student
{
int age;
float score;
char name[100];
};
int main(void)
{
int len;
struct student *pArr;
int i;
printf("请输入数组长度:\n len=");
scanf("%d",&len);
pArr=(struct student *)malloc(sizeof(struct student )*len); //pArr是一个结构体指针变量,malloc函数默认取第一个字节的地址,并将其地址赋值给pArr
for(i=0;i<len;i++)
{
printf("请输入第%d个学生的个人信息:\n",i+1);
printf("age=");
scanf("%d",&pArr[i].age);
printf("score=");
scanf("%f",&(*(pArr+i)).score);
printf("name=");
scanf("%s",(pArr+i)->name); //不需要加“&”,因为pArr[i].name为int*类型
printf("age=%d,score=%f,name=%s\n",pArr[i].age,pArr[i].score,pArr[i].name);
}
return 0;
}
在上面的代码中, &pArr[i].age等价于&(*(pArr+i)).age等价于&(pArr+i)->age,三者在scanf函数中可以互换使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)