7、结构体之结构体数组

结构体这块本来学着没有什么问题的,但是,有时候的学习不知道怎么的,可能是课程进度有点快,会让自己把前面的知识点与现学的联系起来,从而使自己迷惑起来。好了,先说问题:在前面的指针的学习中,我一直过于执着于——*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~但是说白了也是自己没有彻底的掌握好。

总结一下结构体指针:

  1. 结构体指针就是指向结构体变量的指针;
  2. 如果一个指针变量中保存了结构体变量的首地址,那么这个指针变量就指向该结构体变量.
  3. 通过结构体指针即可访问该结构体变量,这与数组指针和函数指针的情况是相同的
  4. 结构指针变量说明的一般形式为: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函数中可以互换使用。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值