首先牢牢记住下面这个规则:
-
sizeof(数组名),数组名表示整个数组。计算的是整个数组的大小
-
&数组名,数组名表示整个数组,取出的是整个数组的地址
除此之外,所有的数组名都是数组首元素的地址
关键词:sizeof、&
接下来就可以根据规则做题了:
1.整形数组:


2.字符数组:

改为strlen的情况:

要了解strlen的特性:遇到\0才终止读取




3、二维数组
int a[3][4]={0}; //二维数组


笔试题1:

ptr取到的是整个数组的地址(&a),指向数组末尾,-1后再取地址便是5;
a是首元素地址,加1再解引用便得到2。
笔试题2:

-
p是一个结构体指针,p+0x1就是在整个p上加1,加的是20个字节,转换为16进制便是0x00100014
-
unsigned long将p强制转换为一个long整型,整型加1就是加1,转换为16进制便是0x00100001
-
unsigned int*将p强制转换为一个int指针类型,指针加1要看步长,即int型为加4,转换为16进制便是0x00100004
笔试题3:

//小端,x86环境
ptr1同上题类似,为0x4,就不解释了
ptr2,首先将a转换为整型,整型+1就是+1,ptr2指向如图所示位置, 然后将其转换为整型指针后解引用,会解4个字节,因此按小端模式最终打印0x20 00 00 00

笔试题4:

首先不要被()迷惑了,它并不是{},因此数组其实为{1,3,5},即只取括号内第二个的数字
放完后的数组是这样的:

a[0]是第一行的数组名,没有与sizeof结合,没有与&结合,因此数组名就是首元素地址,即1的地址
,p[0]实则为*(p+0),即*p,即*a[0],即1
笔试题5:

解读:

-4,以地址形式打印,打印出的是补码

笔试题6:

&aa的类型是int (*)[2][5],加一操作会导致跳转一个int [2][5]的长度,直接跑到刚好越界的位置。减一以后回到最后一个位置1处。*(aa + 1)相当于aa[1],也就是第二行的首地址,自然是5的位置。减一以后由于多维数组空间的连续性,会回到上一行末尾的6处。
笔试题7:

要知道a是一个指针数组,存放的三个数据为char*类型,分别指向三个字符串的首地址;
而char** pa是说pa是一个指针,指向char*这个对象,因此将a赋给它就是首元素的地址,
pa++就是跳过一个char*的对象,pa便指向at。

笔试题8:

先理清关系:

打印的第一行代码,++cpp,cpp指向的是char**对象,因此跳过一个char**对象,指向了c+2的位置,再解引用,得到POINT;
第二行代码,++cpp,cpp再次跳过一个char**对象,指向了c+1的位置,c+1再--,变为c,再解引用,指向了ENTER,再加3,指向E,打印得到ER;
第三行代码,*cpp[-2]可以看成**(cpp-2),它使cpp指向c+3的位置再解引用,指向了FIRST,再加3,指向S,打印的到ST;
第四行代码,cpp[-1][-1]可以看成*(*(cpp-1)-1)+1,由于第一和第二行代码将cpp加到了c+1这个位置,cpp-1便指向了c+2这个位置,解引用得到c+2,再减一变为c+1,再解引用指向NEW,+1指向E,打印出EW