gpt4 book ai didi

c++ - *++*++ppp, *++pp[1], *++(*(1+ppp) 有什么具体区别吗?(C/C++指针问题)

转载 作者:行者123 更新时间:2023-11-30 21:26:49 26 4
gpt4 key购买 nike

#include <cstdio>
using namespace std;

int main()
{
const char *p[] = { "aa", "bb", "cc" };
const char **pp[] = { p + 2, p + 1, p };
const char ***ppp = pp;

printf("%s\n", **++ppp ); // bb
printf("%s\n", *++*++ppp); // bb
printf("%s\n", *++pp[1]); // cc
// printf("%s\n", *++(*(1+ppp))); wrong

return 0;
}

Microsoft VS2015 输出:
bb
bb
抄送
执行异常:0xC0000005

*++*++ppp*++pp[1]*++(*(1+ppp)有什么具体区别吗?*++ppp不是pp[1]吗?*++ppp不是 >*(1+ppp)?谢谢!

最佳答案

TL;DR:是的,*++pp[1] 之间存在很大差异。前者在取消引用指针之前递增指针,后者取消引用指向的元素之后的元素。返回的值是相同的,但在第一种情况下指针发生了变化

<小时/>

重要提示:永远不要在生产代码中编写这样的行!您可以通过实验代码和傻瓜代码来完成此操作。但专业代码必须清晰且易于理解。

我知道一些样式指南禁止在其他表达式中使用增量运算符。他们必须坚持自己的路线。

<小时/>

让我们剖析所有的行,看看它们对变量做了什么。

printf("%s\n", **++ppp ); // *(*(++p))

ppp 递增并指向 pp[1]。内容指向 p+1,它指向打印的 "bb"。检查。

printf("%s\n", *++*++ppp); // *(++(*(++ppp)))

ppp 再次递增并指向 pp[2]。取消引用和预递增让它指向p+1。这是指向打印的 "bb" 的内容。检查。

printf("%s\n", *++pp[1]); // *(++(pp[1]))

这次您递增 pp[1],此后它指向 p+2pp 本身无法递增,因为它是一个数组,因此 pp[1] 会递增。好的,p+2 指向打印的 "cc"。检查。

printf("%s\n", *++(*(1+ppp))); // *(++(*(1+ppp)))

总和1+ppp指向数组pp之后pp[3]。请记住,您之前已将 ppp 递增了两次!取消引用该指针是未定义的行为,并且可以传递任何值。然后,该值被解释为指向 const char ** 的指针,您尝试再次递增和取消引用该指针。这会导致指针无效,从而引发段错误。繁荣。

<小时/>

这就是您可以用来调查问题以了解指针和指针数组如何工作的方法:

#include <cstdio>
using namespace std;

void print_pointers(const char *p[], const char **pp[], const char ***ppp)
{
printf("p = %p : %p %p %p\n", p, p[0], p[1], p[2]);
printf("pp = %p : %p %p %p\n", pp, pp[0], pp[1], pp[2]);
printf("ppp = %p\n", ppp);
}

int main()
{
const char *p[] = { "aa", "bb", "cc" };
const char **pp[] = { p + 2, p + 1, p };
const char ***ppp = pp;

print_pointers(p, pp, ppp);
printf("%s\n", **++ppp ); // bb
print_pointers(p, pp, ppp);
printf("%s\n", *++*++ppp); // bb
print_pointers(p, pp, ppp);
printf("%s\n", *++pp[1]); // cc
print_pointers(p, pp, ppp);

const char ***p1 = 1+ppp;
printf(" 1+ppp = %p\n", p1);
const char **p2 = *p1;
printf(" *(1+ppp) = %p\n", p2);
++p2;
printf(" ++(*(1+ppp)) = %p\n", p2);
const char *p3 = *p2;
printf("*++(*(1+ppp)) = %p\n", p3);
printf("%s\n", p3); // printf("%s\n", *++(*(1+ppp)));

return 0;
}

关于c++ - *++*++ppp, *++pp[1], *++(*(1+ppp) 有什么具体区别吗?(C/C++指针问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58889655/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com