指针和数组相关习题
我们学完了指针和数组,现在做些习题巩固下自己:
1.&数组名和数组名的区别:
2.结构体指针:
注:结构体指针p:p+1指加20,20的十六进制为14;
只有指针类型的变量+1等于加其所指类型的大小 ,除此之外+1为正常的加1。所以,(unsigned long)+1就是简单加1。
3.将变量字节化:
画图解释为:
4:逗号表达式:
首先,逗号表达式是指,以( )括着,中间以逗号隔开的表达式。形如(x,y)=y,即以最右边值为结果。如(1+2,3+2)值为5。
请看下列代码:
5.二维数组:
解释如下:
注:1.二维数组当做一维数组画图处理;
2.指针相减指指针之间经历元素个数,&p[4][2]和&a[4][2]经历4个元素,相减%d为-4;
3.%p是无符号整数,存取涉及原码补码:
-4原码:10000000 00000000 00000000 00000100
反码: 11111111 11111111 11111111 11111011
补码: 11111111 11111111 11111111 11111100 为FFFFFFFC
6.二维数组中&数组名和数组名:
注:二维数组中&a指整个数组,&a+1指下个数组地址,a+1指第二行(从6开始为第二行)地址。
7.解释下列代码:
(*(void (*)( ) )0)( );----->void (*)( )是函数指针---->(void (*)( ) )0 是指针将0号地址强转为函数指针---->(*(void (*)( ) )0)是解引用,将4个字节内容拿出---->(*(void (*)( ) )0)( )指调用0号地址所对应的函数。
void (*fun(int,void(*)(int) ) )(int);简化为:
typedef void(*p_fun)int;
p_fun fun(int,void(*)(int) ) ;
fun(int,void(*)(int) ) fun函数两个参数,一个类型为int,一个是函数指针;
void (*fun(int,void(*)(int) ) )(int)指fun函数返回值是函数指针。
8.指针数组:
画图解释如下:
9:较复杂一个题:
画图解释如下:
printf("%s\n", **++cpp);画图如下:
注意:++cpp为前置加加,cpp也要加1。所以printf("%s\n", **++cpp)结果为“POINT”
printf("%s\n", *--*++cpp + 3);画图解释如下:
printf("%s\n", *--*++cpp + 3)结果为:“ER”
printf("%s\n", *cpp[-2] + 3);画图如下:
所以printf("%s\n", *cpp[-2] + 3)结果为:“ST”
printf("%s\n", cpp[-1][-1] + 1);画图如下:
所以,printf("%s\n", cpp[-1][-1] + 1)结果为:“EW”
对于这个题,重要的是将图画好,思路清晰。