1.下列程序的打印结果是?
char p1[15]= "abcd",*p2= "ABCD", str[50]= "xyz";
strcpy(str+2,strcat(p1+2,p2+1));
printf("%s",str);
A xyabcAB
B abcABz
C ABabcz
D xycdBCD
E 运行出错
解析:这道题实际上我并没有做错,但感觉这个知识点记得并不是很牢靠,不敢保证下一次也不会错,所以记之。
strcpy(a, b):将字符串b中的内容拷贝到a所在的空间,最后返回a。使用时必须注意,a的空间必须大于b的字符串大小,否则会导致崩溃。
strcat(a, b):将字符串b中的内容拼接在字符串a之后,最终返回a。使用时必须注意,a的空间必须可以容纳a、b两个字符串。
2.下面程序的输出结果是?
#include<iosteam>
void main(){
int n[][3] = {10,20,30,40,50,60};
int (*p)[3];
p=n;
cout<<p[0][0]<<","<<*(p[0]+1)<<","<<(*p)[2]<<endl;
}
A 10,30,50
B 10,20,30
C 20,40,60
D 10,30,60?
解析:数组名是数组的首地址,数组n中第一个元素的类型是int[3]。n的二维数组中,首元素的地址就是int(*)[3]。恰好与(*p)[3]的类型相同。
所以p = n可以完成赋值,(*p)[3]的三个元素分别是10,20,30。
int (*p)[3]的意义是,p是一个指针,指向一个有3个int类型元素的数组。数组指针必须经过初始化或者赋值后才可以使用,否则会导致编译报错。
3.有一个如下的结构体:?
struct A{
long a1;
short a2;
int a3;
int *a4;
};
?请问在64位编译器下用sizeof(struct A)计算出的大小是多少?
A 24
B 28
C 16
D 18?
解析:这个并没有什么难点。如果非要说的话,那就是在不同的操作系统中,long类型的长度可能是4,可能是8。比如Linux操作系统下就为8,但是在VS中,不论是64位编译器还是32位编译器long类型长度都是4个字节。但在这道题无伤大雅。
给出了64位编译器,默认对齐数为8。?
按照Linux的8字节计算,
long(8) —— 占8个字节
short(2)、int(4) —— 占8个字节(这8个字节中放不下下一个元素)
int* (8) —— 占8个字节
共计24
按照VS的4个字节计算
long(4)、short(2) —— 占8个字节(这8个字节中放不下下一个元素)
int(4) —— 占8个字节(这8个字节中放不下下一个元素)
int* (8) —— 占8个字节
共计24
在这里我们再移植过来一个知识点:
64位操作系统上64位编译器,默认对齐数8
64位操作系统上32位编译器,默认对齐数8
32位操作系统上32位编译器,默认对齐数4
4.数组定义为”int a[4][5];”, 引用”*(a+1)+2″表示()(从第0行开始)?
A a[1][0]+2
B a数组第1行第2列元素的地址
C a[0][1]+2
D a数组第1行第2列元素的值?
解析:这道题充分体现了二维数组的离谱之处。?
int a[4][5]是一个二维数组,数组有4个元素,每个元素都是一个拥有5个int类型元素的数组。
a + 1 所代表的是 a[1]
解引用之后再加2,也就是a[1][2]了。
?二维数组着实是C语言之中比较坑人的知识点。
大部分教材对于二维数组的名字,只是浅浅淡淡的一句——数组名表示数组第一个元素的地址。
然后呢?然后全靠脑补。
第一个元素的地址,首先我们要知道的是,二维数组,虽然我们很多人以理解矩阵的方式来代入它,但实际上,它与矩阵之间有着天差地别。
二维数组a[4][5]的第一个元素,是一个拥有5个int型变量的数组,即int[5]。而我们通常所说的第一个元素,就真的是它实实在在的第一个元素,第零行第零列的那个。
//C++
int main() {
int a[2][3];
cout << typeid(*a).name() << endl;
cout << typeid(**a).name() << endl;
return 0;
}
?如图所示,虽然二维数组的数组名可以经过两次解引用,但这并不代表它就是二级指针:
//C++
int main() {
int a[2][3];
cout << typeid(*a).name() << endl;
int(*p)[3] = a;
cout << typeid(p).name() << endl;
cout << typeid(*p).name() << endl;
return 0;
}
?可见,数组指针也具有与之相同的特性,但是可以明确的是,数组指针的数组名绝对不是一个二维数组。
当我们想要将二维数组名赋值给一个二维数组时,我们可以得到如下报错:
?好了,拨云见月。
我真切是个嘴笨的人,并不知道该如何描述,如何详细的介绍此处的内容。可能随着今后不断地学习,我才可以详尽地对这里地原理等做出至少令我个人满意地讲解。
|