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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于c语言结构体变量成员引用的问题相关的知识,希望对你有一定的参考价值。

⑴以下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)

这四题都是关于结构体变量引用的,求大神讲解,最好能每个选项说明为什么对为什么错,越细致越好。谢谢

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语言

参考技术A

第一题:

    貌似是你打字的时候,弄错了,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正确

参考技术B (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是**运算。本回答被提问者和网友采纳

以上是关于关于c语言结构体变量成员引用的问题的主要内容,如果未能解决你的问题,请参考以下文章

C语言-结构体

c语言中定义结构体都有哪些方法?

C语言结构体函数的返回值是结构体结构体变量中的信息

C语言结构体函数的返回值是结构体结构体变量中的信息

c语言中怎样通过索引获取结构体成员的值

c语言自定义类型——结构体,位段(匿名结构体,结构体的自引用,结构体的内存对齐)