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

2024-11-25 06:31:51
推荐回答(3个)
回答1:

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

回答2:

第一题:

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

回答3:

(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是**运算。