大家好呀!👋这个是付青云同学的博客,是一名大一在校生哦!😁😁
目前一直在学习C语言。🐸
写博客是为了来记录我的学习过程,同时也希望通过博客能够帮助到需要帮助的人。
如果我的博客可以帮助到你,不妨给我一个关注哦😁
前四题在这里
下面这四道题是比较有难度的
文章目录
指针题目
第五题🤨
intmain(){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]);return0;}
先自己尝试看看吧!
🫱解析🫲
这个题目有点难度
我们可以尝试画图来一步一步解决
首先是这个:
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
第六题🤨
intmain(){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 5return0;}
先自己尝试看看吧!
🫱解析🫲
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
第七题🤨
intmain(){char* a[]={"work","at","alibaba"};char** pa = a;
pa++;printf("%s\n",*pa);//"at"return0;}
先自己尝试看看吧!
🫱解析🫲
这题比较简单,pa获得的是a的首元素的地址,所以当pa++,则跳到下个元素地址,解引用一下就是at
第八题🤨
intmain(){char* c[]={"ENTER","NEW","POINT","FIRST"};char** cp[]={ c +3,c +2,c +1,c };//FIRST POINT NEW ENTERchar*** cpp = cp;printf("%s\n",**++cpp);printf("%s\n",*--*++cpp +3);printf("%s\n",*cpp[-2]+3);printf("%s\n", cpp[-1][-1]+1);return0;}
先自己尝试看看吧!
🫱解析🫲
看到这个题目的时候是不是有点懵了哈哈。说实话,我也是,但是,如果你仔细分析还是可以解出来的。😁
我们来画图分析:
- 首先,我们依照定义画出对应关系 如图:
- 第一个很好分析,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
完
最后,创作不易,如果对你有帮助的话不妨来个三连?😁😎
版权归原作者 付青云同学 所有, 如有侵权,请联系我们删除。