关于c语言结构体变量成员引用的问题

⑴以下sacnf函数调用语句对结构体变量成员的引用不正确的是(D)structpupil{charnam[20];intage;intsex;}pup[5],*p;p=p... ⑴以下sacnf函数调用语句对结构体变量成员的引用不正确的是(D)
struct pupil
{ char nam[20];int age;
int sex;}
pup[5],*p;p=pup;
A)scanf("%s,pup[0],name“)
B)scanf("%d,&pup[0].age")
C)scanf("%d,&(p->sex)")
D)scanf("%d,p->age")

⑵若有以下定义的语句
struct student
{ int age
int name;};struct student stu[3]={{1001,20},{1002,19},{1003,21}};
main()
{ struct student *p;
p=stu,…}
则以下不正确的应用是(D)
A)(p++)->num B)p++ C)(*p).num D)p=&stu.age

⑶设有如下定义:
struct sk
{ int n;
float x;}data,*p;
若要使p只想data中的n域,正确的赋值语句是(C)
A)p=&data.n B)*p=data.n C)p=(struct sk*)&data.n D)p=(struct sk*)data.n

⑷若有以下说明和语句:
int c[4][5],(*p)[5];
p=c;
能够正确引用c数组元素的是(D)
A)p+1 B)*(p+3) C)*(p+1)+3 D)*(p[0]+2)

这四题都是关于结构体变量引用的,求大神讲解,最好能每个选项说明为什么对为什么错,越细致越好。谢谢
展开
 我来答
stone李想
2019-10-23 · TA获得超过1.9万个赞
知道答主
回答量:1
采纳率:0%
帮助的人:665
展开全部

scanf的用法,格式后的参数都必须是地址,name是数组名,本身就是数据,age和sex都是整型数据,必须使用取地址符&。

p是struct student*类型,stu是stu[3]这个数组的第一个元素的地址,p指向第一个元素,因此ABC都是对的,D错在把(int*)变量值赋值给(struct student*)变量,有个强制转换则不会错,因为age是结构体第一个变量,其地址就是结构体变量的地址。

是指针间的赋值,必须保证左右操作数的指针类型是一致的。由于n是结构体sk的第一个变量,因此其地址与结构体变量地址相同,可以强制转换得到正确的地址。

c是一个二维数组,p是一个指向数组的指针,因此p的*运算都是得到一个数组,**运算才能取到数组中的值。只有D是**运算。

扩展资料:

C语言初学者比较喜欢的Turbo C 2.0提供了400多个运行时函数,每个函数都完成特定的功能,用户可随意调用。这些函数总体分成输入输出函数、数学函数、字符串和内存函数、与BIOS和DOS有关的函数、 字符屏幕和图形功能函数、过程控制函数、目录函数等。

Windows系统所提供的Windows SDK中包含了数千个跟Windows应用程序开发相关的函数。其他操作系统,如Linux,也同样提供了大量的函数让应用程序开发人员调用。

参考资料来源:百度百科-C语言

mxl033
2013-09-15 · TA获得超过216个赞
知道小有建树答主
回答量:120
采纳率:61%
帮助的人:81.7万
展开全部

第一题:

    貌似是你打字的时候,弄错了,scanf函数,第一个参数是个字符串,里面包含读取信息的格式,第二个是个不定参数,也就是参数的个数不确定,里面依次排列的是第一个参数里面指出的要读取的信息,所以这四个选项都写错了,正确应该是:

A)scanf("%s", pup[0].name)
B)scanf("%d", &pup[0].age)
C)scanf("%d", &(p->sex))
D)scanf("%d", p->age)

如题所示,pup是一个pupil类型的数组,有5个元素,而p是一个指针,其指向pup数组的首地址,根据以上信息,我们来分析各个选项

A. 由于scanf函数读取的信息要传递到函数外面,所以存放信息的参数都是采取指针传递的方式,因此,后面那个参数必须是内存的地址;A中%s代表,要读取的是个字符串,而pup[0].name是一个字符数组,数组名即代表数组首地址,所以A正确

B. %d代表要读取整型,pup[0].age代表age这个结构体成员,而&是取地址符,所以也是正确的

C. 同样要读取整型数据,由于p是一个指针,所以引用它的成员要用"->"而不是".",然后加&也是取地址的意思,所以C也正确

D. 最后的选项,很明显没有加&,而直接传入结构体成员"age",所以这个错了


第二题:

    这道题貌似也打错了,结构体中两个int类型的成员,age和name,而选项中却都写成num,考虑到name不应该是int类型,姑且把name更正成num。

A. p是指向同类型数组stu的指针而p++是在原有地址上做位置偏移,结果等同于stu[0]变位stu[1]

而作为指针的成员访问符号,(p++)->num的意思是,先取p->num的值,再将地址偏移加1,所以A没有问题

B. A没问题了,B肯定也没有问题

C. *是取地址所指向的内存里的信息,*p就是取p指向的内容,而非指针的实体变量,访问其成员就用"."符号,所以(*p).num就是取得p所指向结构体的成员num的值,这个选项没问题

D. p是student类型的指针,不能被赋予int类型数据(age)的地址,只是其一,其二,stu是数组名本身代表的就是数组首地址,&stu.age的写法是错误的,应该是&stu[0].age或者&(*stu).age,所以此选项错了


第三题:

    p是sk类型的指针而n是int类型,所以在赋值前必须要做强制类型转换,否则编译不会通过。四个选项中,A B没有做转换,PASS;而C D选项都是可以编译通过的,但从逻辑上分析,C做的是把data中成员n的地址给了p,而n实际是结构体的第一个成员,也就是说,n的地址就相当于是结构体的地址,所以C所做的实际就是把data的地址赋值给了p,而D显然就错了,它把n的值当成了地址赋给p,而n实际上不是一个地址,这样导致p指向了一块不确定的位置,有可能是0,这样是很危险的

所以综上所述,C是对的


第四题:

    c是一个二维数组,p是一个指针数组(一个数组,其元素为指针),它们的一维元素个数相同,所以当p=c时,p中的每个元素即对应了c中的第二维度;然后我们分析选项:

题目说的是能引用c中元素的是哪个,考虑到四个选项,我们姑且认为这里的“元素”指的是c中最内层的元素个体,也就是某个int类型的值;

A. p+1代表的是p数组的第二个元素,即一个指向c第二维的数组指针,这个选项不对

B. p+3同理代表的是p的第四个元素,而*则将数组指针转化为数组,即c[3],类型为int[5]

C. 同上*(p+1)对应的是c[1]而*(p+1) + 3就是c[1]指向的第二维数组的地址偏移加3,其实是一个int类型的指针,int*

D. p[0]相当于*(p + 0)就是c[0],p[0] + 2就是地址偏移加2,再用*取值,最后的结果就是c[0][2],类型为int,所以D正确

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
nifh80s
推荐于2016-06-23 · TA获得超过152个赞
知道小有建树答主
回答量:133
采纳率:100%
帮助的人:69.7万
展开全部
(1)、scanf的用法,格式后的参数都必须是地址,name是数组名,本身就是数据,age和sex都是整型数据,必须使用取地址符&;
(2)、p是struct student*类型,stu是stu[3]这个数组的第一个元素的地址,p指向第一个元素,因此ABC都是对的,D错在把(int*)变量值赋值给(struct student*)变量,如果有个强制转换则不会错,因为age是结构体第一个变量,其地址就是结构体变量的地址。
(3)、与(2)类似,是指针间的赋值,必须保证左右操作数的指针类型是一致的。由于n是结构体sk的第一个变量,因此其地址与结构体变量地址相同,可以强制转换得到正确的地址。
(4)、c是一个二维数组,p是一个指向数组的指针,因此p的*运算都是得到一个数组,**运算才能取到数组中的值。只有D是**运算。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式