指向结构变量的指针 :
一个指针变量当用来指向一个结构变量时,称之为结构指针变量。结构指针变量中的值是所指向的结构变量的首地址
结构指针变量说明的一般形式为:
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,该变量指针只是用来管理那些已分配内存的字符串。