C语言 指向结构变量的指针和指向结构数组的指针

指向结构变量的指针 :

一个指针变量当用来指向一个结构变量时,称之为结构指针变量。结构指针变量中的值是所指向的结构变量的首地址

结构指针变量说明的一般形式为:
             struct 结构名 *结构指针变量名

例如:struct stu *pstu;

赋值是把结构变量的首地址赋予该指针变量,不能把结构名赋予该指针变量

结构名类似类,而结构变量类似对象,结构名和结构变量是两个不同的概念,不能混淆

例如:如果 boy是被说明为 stu 类型的结构变量,则:pstu=&boy

有了结构指针变量,就能更方便地访问结构变量的各个成员。
其访问的一般形式为:
       (*结构指针变量).成员名
或为:
       结构指针变量->成员名

例如:pstu->成员名

struct stu
{
int num;
char *name;
char sex;
float score;
} boy1={102,"Zhang ping",'M',78.5},*pstu;
main()
{
pstu=&boy1;//结构指针变量指向结构变量地址
printf("Number=%d\nName=%s\n",boy1.num,boy1.name);
printf("Sex=%c\nScore=%f\n\n",boy1.sex,boy1.score);
printf("Number=%d\nName=%s\n",(*pstu).num,(*pstu).name);
printf("Sex=%c\nScore=%f\n\n",(*pstu).sex,(*pstu).score);
printf("Number=%d\nName=%s\n",pstu->num,pstu->name);
printf("Sex=%c\nScore=%f\n\n",pstu->sex,pstu->score);
}

结构变量.成员名
(*结构指针变量).成员名
结构指针变量->成员名
这三种用于表示结构成员的形式是完全等效的。

指向结构数组的指针:

指针变量可以指向一个结构数组,这时结构指针变量的值是整个结构数组的首地址。结
构指针变量也可指向结构数组的一个元素,这时结构指针变量的值是该结构数组元素的首地
址。

struct stu
{
int num;
char *name;
char sex;
float score;
}boy[5]={
{101,"Zhou ping",'M',45},
{102,"Zhang ping",'M',62.5},
{103,"Liou fang",'F',92.5},
{104,"Cheng ling",'F',87},
{105,"Wang ming",'M',58},
};
main()
{
struct stu *ps;//定义结构指针变量
printf("No\tName\t\t\tSex\tScore\t\n");
for(ps=boy;ps<boy+5;ps++)//结构变量指针指向结构数组首地址
printf("%d\t%s\t\t%c\t%f\t\n",ps->num,ps->name,ps->sex,ps->score);
}

结构指针变量作函数参数:

struct stu
{
int num;
char *name;
char sex;
float score;}boy[5]={
{101,"Li ping",'M',45},
{102,"Zhang ping",'M',62.5},
{103,"He fang",'F',92.5},
{104,"Cheng ling",'F',87},
{105,"Wang ming",'M',58},
};
main()
{
struct stu *ps;//定义结构指针变量
void ave(struct stu *ps);//定义函数原型
ps=boy;//结构指针变量指向结构数组首地址
ave(ps);//结构指针变量作为参数传递
}
void ave(struct stu *ps)
{
int c=0,i;
float ave,s=0;
for(i=0;i<5;i++,ps++)
{
s+=ps->score;
if(ps->score<60) c+=1;
}
printf("s=%f\n",s);
ave=s/5;
printf("average=%f\ncount=%d\n",ave,c);
}

结构变量中的指针应该只用来在程序中管理那些已分配和在别处分配的字符串。如ps->name,该变量指针只是用来管理那些已分配内存的字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值