代码块如下,不过直接看图片可能会更清晰一点(0V0);
int main()
{
char* c[] = { "ENTER","NEW","POINT","FIRST" };
char** cp[] = { c + 3,c + 2,c + 1,c };
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;
}
肯定有很多朋友看到这个题目头都大了,怎么这么多***呢?
哈哈,没关系!驽马来带你庖丁解牛!
咱们来慢慢分析!
我们看,
首先程序定义了一个指针数组,也就是char *c【】,每个数组中的指针指向图片中的一段字符串。
比如说,从c[0]指向ENTER,c[1]指向NEW;
来,直接给大家画张图!

而第二行,则还是定义了一个指针数组,不过这是一个二级指针数组,
里面存的是二级指针!
比如说cp[0]存的是c+3,c+3是一个二级指针,指向另外一个指向字符串的指针!很拗口是吧?来,我们再上个图!

我们可以清楚的看到,cp这个数组,里面的元素是一个个二级指针!
比如对c+3进行解引用,则就是c[3],也就是说,c[3]是指向一段字符串首字符的指针!而c+3是指向c[3]的指针!
第三行
程序则定义了一个三级指针!这个指针指向了cp数组的首元素!也就是指向了c+3这个二级指针!

我们来细细研究下第一个printf!
printf("%s\n", **++cpp);
首先我们一步一步刨析!
我们要知道解引用符号和自增符号其实优先级是一样的,但是++在前面,那么其功能就是先加后使用,那么此时,cpp从原来指向cp[0]变为了,指向cp[1];

那么对于接下来的两个解引用符,我们就一步到位!
第一层解引用,我们获得了一个二级指针,也就是指向c+2的指针,
然后第二层引用,我们就获得了一个指针,这个指针指向c[2]的首字符,
也就是POINT,中的P
我们对其进行字符串打印,得到了结果:POINT
那我们继续来看,第二个printf;
printf("%s\n", *-- * ++cpp + 3);
我们对其进行分析,先自增,那么cpp从指向cp[1]变为了指向cp[2];

对其解引用,我们得到了一个指向c+1的指针;
然后此时,这个指针自减,那么得到的这个指针,则又指向了c(也就是指向了c的首元素c[0]);

然后对其解引用,再加上3,这意味着,这个指针最后指向了字符串ENTER的第四个字符!也就是E!
最后打印出来的结果:ER
前面两个打印因为有自增运算,所以以及改变了某些指针的方向
后面两个打印,则只是基于自身的运算,并没有再改变指针的指向。
printf("%s\n", *cpp[-2] + 3);
首先我们要知道,cpp[-2]其实就相当于*(cpp-2),那么*cpp[-2]+3也就相当于
((cpp-2))+3;
*(cpp-2)相当于c+3,再对其解引用,得到了指向FIRST首字符F的一个指针,最后+3,则这个指针指向了S;
打印出来的结果是:ST
我们来看最后一个printf!
cpp[-1][-1]+1;
同上,我们可以把cpp[-1][-1]理解为*(*(cpp-1)-1),内层解引用得到了c+2,
外层解引用得到了指向NEW首字符N的指针,最后+1,则说明这个指针后挪一位,指向了E;
那么打印字符串,得到了:EW

如图,这就是我们得到的结果!
本文通过一道面试题深入解析C语言中的指针概念,包括一级、二级和三级指针的使用,以及解引用和自增运算的结合。通过详细分析代码执行过程,解释了不同指针操作如何影响字符串的访问,帮助读者更好地理解和掌握C语言指针的运用。
&spm=1001.2101.3001.5002&articleId=123697906&d=1&t=3&u=9c1334e88b864df8949610c49d83f6b4)
1209

被折叠的 条评论
为什么被折叠?



