struct结构体名*结构体指针变量名;
例如:
struct Student*p;
定义一个指针变量p,它指向一个struct Student类型的对象。
与前面讨论的各类指针变量一样,结构体指针变量也必须要先赋值后使用。赋值是把结构体变量的首地址赋予该指针变量,而不能把结构体名赋予该指针变量。例如student是定义的struct Student类型的结构体变量,则“p=&student;”有了结构体指针变量,就可以方便地访问结构体变量的各个成员。其引用的一般形式为:
(*结构体指针变量).成员名
或
结构体指针变量->成员名
例如:
(*p).num
或
p->num
需要注意:(*p)两侧的括号不可少,因为成员符“.”的优先级高于“*”。若去掉括号写作*p.num,则等同于*(p.num),这样表达的意思就不对了。
下面通过例子来说明结构体指针变量的具体使用方法。
【例8.4】通过结构体指针变量输出所指向的结构体变量的成员信息。
程序内容如下:
1 /*这是一个有关于结构体指针知识讲解的事例程序*/
2 #include<stdio.h>
3 struct Student
4 {
5 int num;
6 char name[20];
7 char sex;
8 float score;
9 }student={201801,"Li li",′F′,92.5},*p;
10 int main()
11 {
12 p=&student;
13 printf("Number=%d\n Name=%s\n",student.num,student.name);
14 printf("Sex=%c\nScore=%f\n\n",student.sex,student.score);
15 printf("Number=%d\n Name=%s\n",(*p).num,(*p).name);
16 printf("Sex=%c\nScore=%f\n\n",(*p).sex,(*p).score);
17 printf("Number=%d\n Name=%s\n",p->num,p->name);
18 printf("Sex=%c\nScore=%f\n\n",p->sex,p->score);
19 return 0;
20 }
程序结果如图8.7所示:
图8.7 例8.4程序结果图
【例题中关键问题说明】
(1)本程序声明了一个结构体类型struct Student,定义了struct Student类型结构体变量student,并进行了初始化。
(2)定义了一个指向struct Student结构体类型的指针变量p。在main函数中,将student的首地址赋给p,因此p指向student。
(3)最后用printf语句以三种形式输出student的各成员值,从运行结果可以看出它们是等效的,分别为:
结构体变量.成员名(www.xing528.com)
(*结构体指针变量).成员名
结构体指针变量->成员名
指针变量可以指向一个结构体数组,此时结构体指针变量的值是整个结构体数组的首地址。结构体指针变量也可指向结构体数组的一个元素,这种情况下结构体指针变量的值是该结构体数组元素的首地址。
【例8.5】现有5名职工信息存储在结构体数组中,请使用指向结构体数组的指针变量将其输出。
程序内容如下:
1 /*这是一个有关于结构体指针知识讲解的事例程序*/
2 #include<stdio.h>
3 struct Work
4 {
5 int num;
6 char name[20];
7 char sex;
8 float salary;
9 }worker[5]={{201801,"Li ming",′M′,4500},{201802,"Zhang ping",′M′,3500},{201803,"Zhao qiang",′F′,3600},{201804,"Cheng hong",′F′,5000},{201805,"Wang lin",′M′,4800}};
10 int main()
11 {
12 struct Work*pw;
13 printf("No\t Name\t\t\tSex\tSalary\t\n");
14 for(pw=worker;pw<worker+5;pw++)
15 printf("%d\t%-10s\t\t%c\t%f\t\n",pw->num,pw->name,pw->sex,pw->salary);
16 return 0;
17 }
程序结果如图8.8所示:
图8.8 例8.5程序结果图
【例题中关键问题说明】
(1)本程序中,定义了struct Work结构体类型的数组worker,并初始化。
(2)在main函数中定义了pw为指向struct Work的指针。
(3)在循环语句for中,指针变量pw首先被赋予数组worker的首地址,在第一次循环输出worker[0]的各成员的值。然后通过pw++,使pw自加1,指向worker[1],输出各成员值,再执行pw++后,pw指向worker[2],直到第五次执行pw++后,pw的值变为worker+5,已不再满足循环条件pw<worker+5,循环结束。
需要注意:
(1)若p为指向结构体数组的指针变量,则p指向该结构体数组的0号元素,p+1指向1号元素,p+i指向i号元素。这与前面学过的数组是一样的,如图8.9所示。
(2)一个结构体指针变量可以用来访问结构体变量或结构体数组元素的成员,但不能使它指向一个成员,也就是说不允许将一个成员的地址赋给它。因此,下面的赋值是错误的:
p=&worker[0].num;
如果要将某一成员的地址赋给p,可以用强制类型转换,先将成员的地址转换成指针类型。
例如:
p=(struct Work*)worker[0].name;
此时,p的值是worker[0]元素的name成员的起始地址,可以用“printf("%s",p)”输出。
(3)注意以下两者的不同:
“(++p)->num”先使p自加1,然后得到它指向的元素中num成员的值,即201802。
“(p++)->num”先得到“p->num”的值(即201801),然后p自加1,指向worker[1]。
图8.9 指向结构体数组的指针示例图
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。