指针和数组相关习题

我们学完了指针和数组,现在做些习题巩固下自己:

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”

对于这个题,重要的是将图画好,思路清晰。