C指针练习

nmpmafwu  于 2022-12-17  发布在  其他
关注(0)|答案(1)|浏览(117)

我在做一个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”的。

3pvhb19x

3pvhb19x1#

让我们在进行以下步骤时跟踪所有内容的指向:
最初,我们有这样的:

c:   { "he dast ga", "lllt dumm", "C i", "dar nich" }
cp:  { c + 3, c + 2, c + 1, c }
cpp: cp

printf("%s", **++cpp);递增cpp,所以我们现在有cpp: cp + 1
然后,取消引用它两次:一米三氮一x一米四氮一x。
所以我们打印出C i,我们的变量现在看起来像这样:

c:   { "he dast ga", "lllt dumm", "C i", "dar nich" }
cp:  { c + 3, c + 2, c + 1, c }
cpp: cp + 1

请注意,cpp已更改。
接下来是printf("%s", *-- * ++cpp + 5);
首先,我们再次递增cppcpp: cp + 2。然后取消引用它:*cpp: c + 1。然后递减,得到c并更新cp的适当元素。然后,解引用:*c: "he dast ga",然后加上5:st ga .
因此,我们输出st ga,变量如下所示:

c:   { "he dast ga", "lllt dumm", "C i", "dar nich" }
cp:  { c + 3, c + 2, c, c }
cpp: cp + 2

请注意两个更新:cp[2]cpp
从现在开始,我们不再更新任何变量,所以我不再显示变量,只显示求值时发生的情况。
printf("%s", cpp[-2][0] + 2);

cpp[-2][0] + 2
(cp + 2)[-2][0] + 2
cp[0][0] + 2
(c + 3)[0] + 2
c[3] + 2
"dar nich" + 2
"r nich"

所以我们输出r nich
最后,printf("%s\n", *(cpp[1] + 1) + 3);

*(cpp[1] + 1) + 3
*(*(cpp + 1) + 1) + 3
*(*(cp + 2 + 1) + 1) + 3
*(*(cp + 3) + 1) + 3
*(c + 1) + 3
"lllt dumm" + 3
"t dumm"

所以我们打印出t dumm
把所有的东西放在一起,我们应该打印出C ist gar nicht dumm(大致为:“C毕竟不是那么笨”我相信)。

相关问题