C语言指针部分题目集合

1.

C语言指针部分题目集合_第1张图片

-->>&a为整个数组的地址,&a+1即为跳过一个数组的地址,因此(ptf-1)指针向前移动一个单位,因此*(ptf-1)为5;a为数组名,为首字母地址,因此*(a+1)为第二个元素地址的解引用操作-->>因此最终打印值为2,5。

C语言指针部分题目集合_第2张图片

2.

C语言指针部分题目集合_第3张图片

C语言指针部分题目集合_第4张图片

 i).0x1即为1,p+1则为0x100000+20(题目中规定)=0x100014(将20转化为16进制进行相加);

ii).将p的类型转换为整形,此时加上1,直接在原地址上加上1即可;即0x100000->>0x100001;

iii).将p的类型强转换为一个无符号的整形指针,此时加1,要跳过一个无符号整形,而一个无符号整形为4个字节,即0x100000-->>0x100004.

3.

C语言指针部分题目集合_第5张图片

 

//数组中的元素在地址中储存如上图所示;

//&a+1为整个数组地址,向后跳过整个数组;因此ptr1作为一个整形指针指向最后一位;而ptr1[-1]等价与*(ptr1-1),因为其为一个整形指针,因此会向前移动一个数组,也就是指向地址中的04,进行解引用结果则为4(倒读);

 //a为数组名,指向首元素地址,即地址最开头,对于(int*)((int)a + 1)的解释,我们先引入一个例子:假设存在地址0x00 00 00 05,则强制类型转化为int即为5,5+1=6,再转化为地址即为0x00 00 00 06,两个地址相差的是一个字节;根据此例子,ptr2指向01后面的 00位置!!;由于ptr2为一个整形指针,因此其会访问4个字节,结果拿出的内容就是02 00 00 00(倒读);

 //最终打印结果为4;20000000。

4.

C语言指针部分题目集合_第6张图片

//注意数组里面放的是圆括号,里面为逗号表达式,输出结果为最后一位,也就是里面填充了1,3,5三个数而已,其他位置为0!;也可以理解为此时的数组是a[3][2]={{1,3},{5,0},{0,0}}; 而p=a[0]为首元素的地址,且p[0]等价与*(p+0),因此打印出来的是1。

5.

C语言指针部分题目集合_第7张图片

//p是一个指向含有四个整形元素的数组的指针,a[4][2]即为二维数组中最后一个一维数组的第3个元素, 当将a赋值给p的时候,由于a是首元素地址,类型为int(*)[5],而p的类型是int(*)[4],因此p[4]会向后面每四个元素进行查找,一共往后移动了4*4=16个元素,又因为p[4][2]等价于*(*(p+4)+2),由于地址间的相减是中间元素的地址,因此&p[4][2] - &a[4][2]为-4,如图所示;但是当其以整数形式打印时,结果就为4,而当将-4以地址形式打印时,我们首先来解析以下-4在内存的存储方式:

-->>原码为:10000000 00000000 00000000 00000100;反码为:11111111 11111111 11111111 11111011;补码为:11111111 11111111 11111111 11111100;而以p%形式打印时,其原码与补码相同,因此此时原码等于补码1111 1111 1111 1111 1111 1111 1111 1100;转化成16进制存入地址,为:F F F F F F F C;

C语言指针部分题目集合_第8张图片

 综上,最终结果为:FFFFFFFC,-4。

6.

C语言指针部分题目集合_第9张图片

//二位数组等价与int aa[2][5]={{1,2,3,4,5},{6,7,8,9,10}};

//&aa为整个数组的地址,因此&aa+1会跳过整个数组的地址,当其强行转化为一个整形指针类型后,(ptr1-1)则会向前移动一个整形指针,进行解引用结果为5;

//aa指的是首元素地址,即第一行的地址,因此aa+1代表第二行的地址,进行解引用操作为第二行的元素,在进行强制类型转化成int*后,(ptf2-1)j即表示向前移动一个整形指针,因此解引用操作的结果就是5;

//答案为10;5。

7.

C语言指针部分题目集合_第10张图片

 //首先我们知道形如: char* p="abcdef"是将字符的首字母地址传给了p,因此上述char* a[]存放的是'w','a','a'的地址,即为三个元素的首字母地址;代码对应的内存布局图为:

C语言指针部分题目集合_第11张图片

//对于pa++的操作,我们知道int *p-->>p++指的是跳过一个整形指针,类似的,pa++指的是跳过一个char*类型的指针,所以会跳到下一个char*类型指针,如图:

C语言指针部分题目集合_第12张图片

C语言指针部分题目集合_第13张图片

 //之后*pa便是通过这个地址找到了其内容,即为at。

8.

C语言指针部分题目集合_第14张图片

 其内存分布大致如下:

C语言指针部分题目集合_第15张图片

//对于++cpp,其指向的地址跳到上图所示的位置,进行解引用获得的是c+2,再进行解引用,其得到的是'P'的地址,将以%s的形式进行打印时,会再改地址处往下进行访问,因此得到POINT;

//对于*--*++ccp + 3,其会先进行++cpp的操作,即会在指向下一个位置,进行解引用操作后为c+1;如下图所示:

C语言指针部分题目集合_第16张图片

--(c+1)=c,再次进行解引用操作后为“ENTER”首字母"T"的地址;再加三则为“ENTER”首字母"E"的地址,因此以%s的格式进行打印后会输出"ER";

C语言指针部分题目集合_第17张图片 C语言指针部分题目集合_第18张图片//

 //对于*cpp[-2]+3,由于cpp[-2]等价与*(cpp-2),因此其为c+3,再进行解引用操作为“FIRST”首字母"F"的地址,再加上3则为“FIRST”字母"S"的地址,因此以%s的格式进行打印后会输出"ST";

//对于cpp[-1][-1]+1,y由于cpp[-1][-1]等价于*((*(cpp-1))-1)+1,其中由于cpp仍然指向如图位置:

C语言指针部分题目集合_第19张图片

 因此*(cpp-1)为c+2,c+2-1=c+1,因此*(c+1)为存放字符"NEW"首字母"N"的地址;再进行加1则为

 字符"NEW"中字母"E"的地址;最终以%s的格式进行打印后会输出"EW"。

9.

C语言指针部分题目集合_第20张图片

//对于本题, pulPtr = pulArray说明将数组pulArray的首元素地址传到指针pulPtr里面,*(pulPtr + 3) += 3则是将9改成12;因此打印的结果为6,12。

你可能感兴趣的:(c语言,c++,数据结构,开发语言,算法)