【c语言】【visual studio】几道指针笔试题带你深入理解指针。

引言:指针是学习c语言的第一道坎,希望小伙伴们遇到不理解的不要放弃,而是

题目一:数组指针相关操作。【c语言】【visual studio】几道指针笔试题带你深入理解指针。_第1张图片

答案:

解析:

&a的类型是数组指针拿到的是整个地址,接着(int*)将数组指针强制类型转换成整型指针,用一个整型指针ptr来接收。&a+1,跳过的是整个数组的大小,即prt指向5后面的元素【c语言】【visual studio】几道指针笔试题带你深入理解指针。_第2张图片

所以的意思是整型指针-1,整型指针-1,拿到的是5的地址,再一解引用得到5.

接着单独的数组名是首元素的地址,所以a指向的是a[0]的地址,+1,指向a[1],拿到2的地址,再一解引用得到元素2.

题目二:结构体指针相关操作

【c语言】【visual studio】几道指针笔试题带你深入理解指针。_第3张图片

答案:

【c语言】【visual studio】几道指针笔试题带你深入理解指针。_第4张图片

解析:

为什么都是加1,而结果不一样呢?这里我们只需要知道一点即可,c语言中的加减是根据类型来的。题目中(unsigned long)p是无符号长整型,大小是1字节,+1=+1。(unsigned int*)p是无符号整型指针,大小是4个字节,+1=+4。p是结构体指针,这里题目中结构体的大小是20个字节,+1=+20。所以输出结果不同。

题目三:二维数组指针.1

【c语言】【visual studio】几道指针笔试题带你深入理解指针。_第5张图片答案:

解析:

首先我们需知道,逗号表达式中(a , b)只取b。所以a数组变成了

【c语言】【visual studio】几道指针笔试题带你深入理解指针。_第6张图片 【c语言】【visual studio】几道指针笔试题带你深入理解指针。_第7张图片

int* p=a[0];p指向的是第一行的地址,其中第一行的地址又与首元素地址相同,所以p[0]==1

注:(p[0]——>*(p+0)——>*(a+0)——>a[0])

题目四:二维数组中数组名的理解。

【c语言】【visual studio】几道指针笔试题带你深入理解指针。_第8张图片

答案:

【c语言】【visual studio】几道指针笔试题带你深入理解指针。_第9张图片

解析:

&a是拿到整个数组的地址,再加一拿到的地址指向10后

这时(&a+1)是数组指针,再强制类型转换成整型指针,赋给整型指针ptr1。*(ptr1-1)整型指针减一拿到元素10的地址,再解引用得到10.

同理

我们需要找到*(a+1)等价于 a[1] 所以这里拿到的是第二行的数组 ,数组名是首元素地址。强制类型转换成整型指针并赋给ptr2。*(ptr2-1)整型指针减一拿到元素5的地址再解引用得到5.

题目五:指针减指针,整数%p的打印。

【c语言】【visual studio】几道指针笔试题带你深入理解指针。_第10张图片答案:

【c语言】【visual studio】几道指针笔试题带你深入理解指针。_第11张图片

解析:

首先要理解 int (*p)[4]=a;是什么意思,等号前面的int (*p)[4]是有四列的数组指针,等号后面是有五行五列的数组。也就是将数组a首元素的地址赋给p,然后又在数组指针p中建立了一个四列的新数组。我们画图可以更直观的看到

【c语言】【visual studio】几道指针笔试题带你深入理解指针。_第12张图片&p[4][2] - &a[4][2]是指针减指针。指针减指针的绝对值,得到的是指针之间的元素个数。所以

&p[4][2] - &a[4][2]= -4; 

%p打印的是十六进制的地址,如果是整型打印的是整型的补码的十六进制。

【c语言】【visual studio】几道指针笔试题带你深入理解指针。_第13张图片

四个二进制对应一个十六进制数如:1111——F,1100——C。所以结果是FFFFFFFFFFFFFFFC

题目六:二级指针,三级指针的操作符运算在数组中的理解。

【c语言】【visual studio】几道指针笔试题带你深入理解指针。_第14张图片

答案:

【c语言】【visual studio】几道指针笔试题带你深入理解指针。_第15张图片

解析:

我们一个个分析。char *c是指针数组指向的是数组首元素的地址也就是指向的字符串“DREAM”中的‘D’。

char* *cp也是指针数组,其中cp中的元素分别指向”如图位置【c语言】【visual studio】几道指针笔试题带你深入理解指针。_第16张图片

**++cpp中++的优先级大于**所以先++,++cpp指向 "POINT",*cpp拿到C+2位置,再解引用拿到"POINT"。 此时cpp指向"POINT"。*--*++cpp+3中,优先级 +<++/--<*,所以+cpp指向"NEW",*cpp拿到C+1的位置,再解引用拿到"DREAM",最后再+3,拿到AM的位置。此时cpp指向指向"NEW"。*cpp[-2]+3中,*cpp[-2]等价于*(*(cpp-2)),拿到"FIRST"位置,+3拿到ST。此时cpp还是指向"NEW"。cpp[-1][-1]+1中,cpp[-1][-1]等价于*(*(cpp-1)-1),拿到的是NEW位置,+1拿到EW。此时cpp还是指向"NEW"位置。

题目七:二级指针.2

【c语言】【visual studio】几道指针笔试题带你深入理解指针。_第17张图片

答案:

【c语言】【visual studio】几道指针笔试题带你深入理解指针。_第18张图片

解析:

*a是一个指针数组,*a指向的是的是字符串"work"的首地址。pa是一个二级指针,指向的也是w。所以pa++,指向的是指针数组的第二个元素 "at" 的首地址,所以最后打印*pa得到的是at。

至此七道题结束了,希望对你有帮助。

你可能感兴趣的:(算法,数据结构)