此题中,A选项std.name本身对应的是数组类型,数组类型在使用scanf函数的时候不需要使用&,该符号意为取地址,但是数组名本身就是地址,所以不需要取地址符号,所以A错误
至于C,*p的含义为对指针p进行解引用操作,解引用操作将p指向std,但是在这个式子中,std.gender对应只是字符型,字符型在进行输入的时候要应用&,所以C应当是正确的
此题中,A的意思为响铃,B没有任何意义,C的意义为退格,D的意义为注释
二维数组的定义时,第一维的大小可以为空,但是第二维也就是列的数值必须确定,因为在电脑中数组本身存储的方式是一维线性存储,如果不确定列的大小,就会直接将二维数组中的所有数字全部存在第一维,如果确定了列,也就是确定了一行中能够存储的数据数量,那么这些数字要存储多少行计算机会自己计算,所以ABD都是错误的。
枚举类型就是从第一个确定数值的元素开始向下递增,题中已经确定Sun、Mon、Tue的数值,所以从Wed开始向下数,数到Fri正好是3,所以B正确
此题涉及到对指针和数组名本身的运用
例如&数组名代表的就不再是数组的首元素地址,而是代表的是数组一整个的地址,但是如果进行打印还是数组的首个元素地址,区别在于对其进行+1操作的时候,如果对&数组名进行+1,此时跳过的并不是一个元素,二是数组中的全部元素,从存储数组的存储条的首个位置直接跳到存储条的末尾位置,此时指向的不再是数组的首元素,也不是数组的末尾元素,而是数组所占据内存之后的内存,此时如果再次进行访问就是非法访问,此时的指针也是一个野指针。所以在题中的ptr现在就是一个野指针,数组名本身指向数组的首元素,对其进行+1操作,会将数组名指向的位置移到数组所对应的下一个元素,则在题中打印的时候,*(a+1)所对应的元素应该是数组中的第二个元素也就是2,*(ptr-1)对应的应该是数组的最后一个元素。注意,在这个地方,指针本身是一个int类型的指针,在进行解引用的时候移动四个字节,之所以从数组首位跳跃至数组末尾,是因为对数组名的利用,与指针本身的数据类型没有关系。
此题涉及到二维数组的特殊形式存储
比如图中数组int a[3][2]={(0,1),(2,3),(4,5)}
此时对数组的存储形式不是如下表格的形式
| 0 | 1 |
| 2 | 3 |
| 4 | 5 |
而是完全相反的一种形式
| 1 | 3 |
| 5 | 0 |
| 0 | 0 |
数组中会将(0,1)整体视为第一个元素,此时所对应的存储应该是存储数据1,而之后的1,2,4全部都会丢失,是没有办法顺利存储进入二维数组的。
图中指针所指向也并没有问题,确实是指向数组中的a[0][0],但是如图所示a[0][0]不再是0,a[0][0]的值此时的所对应应当是1
不同的地方在于const所修饰的东西不同
char*const p意味着指针本身的值不可以修改,p是字符型常量指针,指针本身就是常量
char const*p意味着指针所指向的值是常量,p是字符型指针指向一个常量值
const char*p与char*const p相同,const修饰的量都是指针,与指针所指向的东西没有关系。是指针本身的值没有办法修改
题中我所回答的代码错误在于自定义函数,void*swap()此处的viod之后的*是完全没有必要的,因为既然已经是void类型了,就无需再返回任何东西,加了*意味着要返回指针,但是实际上根本不会返回任何东西,所以函数末尾的return 0也是错误的,因为根本不需要返回。
回答的时候要回答到根本,从数据的存储时开始分析,结构体中的成员占用不同的内存,且彼此之间互不影响,而对于共用体而言,所有成员占据同一块内存,对其中任何一个成员修改的时候都势必会影响除他之外所有成员。



