我在做一个c指针练习时遇到了问题。我知道指针是如何工作的,但是这个练习让我很困惑。
#include <stdio.h>
char* c[] =
{
"he dast ga",
"lllt dumm",
"C i",
"dar nich"
};
char** cp[] = { c + 3, c + 2, c + 1, c };
char*** cpp = cp;
int main(void)
{
printf("%s", **++cpp);
printf("%s", *-- * ++cpp + 5);
printf("%s", cpp[-2][0] + 2);
printf("%s\n", *(cpp[1] + 1) + 3);
getchar();
}
有人能给我解释一下吗?
我以为指针cpp会递增并指向值c + 2,我碰巧得到了正确的结果,但它对第二个指针不起作用,然后我发现++不是递增,而是数组的第一个值被删除,这样我就有了一个新的数组,其值为{ c + 2,c + 1,但是我还是不知道我是怎么得到“ci”的。
1条答案
按热度按时间3pvhb19x1#
让我们在进行以下步骤时跟踪所有内容的指向:
最初,我们有这样的:
printf("%s", **++cpp);
递增cpp
,所以我们现在有cpp: cp + 1
。然后,取消引用它两次:一米三氮一x一米四氮一x。
所以我们打印出
C i
,我们的变量现在看起来像这样:请注意,
cpp
已更改。接下来是
printf("%s", *-- * ++cpp + 5);
。首先,我们再次递增
cpp
:cpp: cp + 2
。然后取消引用它:*cpp: c + 1
。然后递减,得到c
并更新cp
的适当元素。然后,解引用:*c: "he dast ga"
,然后加上5:st ga
.因此,我们输出
st ga
,变量如下所示:请注意两个更新:
cp[2]
和cpp
。从现在开始,我们不再更新任何变量,所以我不再显示变量,只显示求值时发生的情况。
printf("%s", cpp[-2][0] + 2);
所以我们输出
r nich
。最后,
printf("%s\n", *(cpp[1] + 1) + 3);
:所以我们打印出
t dumm
。把所有的东西放在一起,我们应该打印出
C ist gar nicht dumm
(大致为:“C毕竟不是那么笨”我相信)。