11.3 指向结构体类型数据的指针
考点3 指向结构体变量的指针
真考链接
考点3难度适中,属于重点理解内容。在选择题中的考核概率为20%。考核方式多以读程序题写运行结果的形式出现。
看下面的例子:
#include <string.h>
#include <stdio.h>
main()
{ struct objects{
char name[20];
int size;
{ char color[10];
float weight;
float height;
};
struct objects obj1;
struct objects *p;
p=&obj1;
strcpy(obj1.name,"pen");
obj1.size=10;
strcpy(obj1.color,"black");
obj1.weight=50.5;
obj1.height=18.5;
printf("name:% s\nsize:% d\ncolor:% s\nweight:% f\nheight:% f\n",obj1.name,obj1.size, obj1.color,obj1.weight,
obj1.height);
printf("name:% s\nsize:% d\ncolor:% s\nweight:% f\nheight:% f\n",(*p).name,(*p).size, (*p).color,(*p).weight,(*p).height);
}
这里声明了一个structobjects类型,并且定义了一个该类型的变量obj1,又定义了一个指向structobjects类型的数据指针p,并且将p指向obj1,接下来是对各成员赋值。第一个printf语句用“.”的方式将obj1成员的值输出。第二个printf语句用(*p)将obj1成员的值输出,因为成员运算符“.”的优先级高于“*”运算符,所以(*p)两侧的圆括号不能省略。以上两个printf函数语句的输出结果是相同的。
可用p->name来代替(*p).name,其中“->”称为指向运算符,它由两部分组成:“-”减号和“>”大于号,它们之间不能有空格,所以“结构体变量.成员名”、“(*结构体指针变量名).成员名”和“结构体指针变量名->成员名”这3种形式是等价的。
小提示
一个结构体变量的指针就是用来指向该结构体类型的存储单元,并指向结构体变量所占据的内存段的首地址。
真题精选
以下程序的输出是( )。
#include <stdio.h>
main()
{ struct s1{int x;int y;};
struct s1 a={1,3};
struct s1 *b = &a;
b->x = 10;
printf("% d % d\n",a.x,a.y);
}
A.13 B.103 C.310 D.31
【答案】 B
【解析】b为指向结构a的指针,通过→运算符改变了a成员x的值为10,所以输出103。