irpas技术客

你的指针学到什么层次了?8个指针题目让你加深对指针的理解(下)-O-_付青云同学

网络投稿 7363

大家好呀!👋这个是付青云同学的博客,是一名大一在校生哦!😁😁 目前一直在学习C语言。🐸 写博客是为了来记录我的学习过程,同时也希望通过博客能够帮助到需要帮助的人。 如果我的博客可以帮助到你,不妨给我一个关注哦😁

前四题在这里


下面这四道题是比较有难度的

文章目录 指针题目第五题🤨🫱解析🫲 第六题🤨🫱解析🫲 第七题🤨🫱解析🫲 第八题🤨🫱解析🫲答案

指针题目 第五题🤨 int main() { int a[5][5]; int(*p)[4]; p = a; printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]); return 0; }

先自己尝试看看吧!


🫱解析🫲

这个题目有点难度 我们可以尝试画图来一步一步解决 首先是这个:

int a[5][5]; int (*p)[4]; p = a;

就像这样: 再看题目

printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);

众所周知:指针相减的值是它们之间的元素个数 所以: 它们之间有4个元素 又因为p在低地址,所以它们p和a的差值为负数 所以打印的就是:FFFF FFFC,-4


第六题🤨 int main() { int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int* ptr1 = (int*)(&aa + 1); int* ptr2 = (int*)(*(aa + 1)); printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));//10 5 return 0; }

先自己尝试看看吧!


🫱解析🫲 int* ptr1 = (int*)(&aa + 1); printf("%d", *(ptr1 - 1)); //在这里,&aa取的是整个二维数组的地址,所以当&aa+1就相当于跳过了整个数组 //之后再将它强制转换为整型指针,所以ptr1-1就相当于往前跳一个元素,指向的是10的地址 int* ptr2 = (int*)(*(aa + 1)); printf("%d", *(ptr2 - 1)); //像这个没有&符号的,就是指向第一行的地址,所以aa+1就相当于跳过了第一行 //之后再将它强制转换为整型指针,所以ptr2-1就相当于往前挑一个元素,指向的是5的地址

下面是图解: 所以这个题目打印的就是10,5


第七题🤨 int main() { char* a[] = { "work","at","alibaba" }; char** pa = a; pa++; printf("%s\n", *pa);//"at" return 0; }

先自己尝试看看吧!


🫱解析🫲

这题比较简单,pa获得的是a的首元素的地址,所以当pa++,则跳到下个元素地址,解引用一下就是at


第八题🤨 int main() { char* c[] = { "ENTER","NEW","POINT","FIRST" }; char** cp[] = { c + 3,c + 2,c + 1,c };//FIRST POINT NEW ENTER char*** cpp = cp; printf("%s\n", **++cpp); printf("%s\n", *-- * ++cpp + 3); printf("%s\n", *cpp[-2] + 3); printf("%s\n", cpp[-1][-1] + 1); return 0; }

先自己尝试看看吧!


🫱解析🫲

看到这个题目的时候是不是有点懵了哈哈。说实话,我也是,但是,如果你仔细分析还是可以解出来的。😁 我们来画图分析:

首先,我们依照定义画出对应关系 如图:

第一个很好分析,cpp++就直接跳往下一个元素地址,再解引用得到POINT 如图:

第二个就开始有点复杂了

先cpp自加,注意上一个已经自加过了,所以我们要在原来的基础上再加一,所以就跳到c+1上面了 如图:

之后解引用,就跳到cp上了,再自减,就是c+1 -1=c,然后再解引用跳到c上 如图:

最后,在c上+3得到的打印就是ER 如图:

第三个cpp[-2]我们可以看成*(cpp-2),所以在上一个的基础上,指向的就是c+3,随后解引用+3,得到的就是ST 如图:

第四个我们可以将cpp[-1][-1]看成* (* (cpp-1) - 1 ) *(cpp-1)就把它带到了c+2处 *(cpp-1) - 1 )=c+2 -1=c+1 最后,得到的就是EW 如图:

答案

综上,所有的答案就是 POINT ER ST EW


最后,创作不易,如果对你有帮助的话不妨来个三连?😁😎


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。