解释为什么你可能会看到1
和5
。 (C标准没有对此进行定义,但无论如何你的编译器都会向前推进)。 可能你的编译器将该行视为
int **f = (int **)B;
然后表达式*f
将从B
的存储(实际上保持int
)读取字节并假装那些是构成指针表示的字节。 这是进一步未定义的行为(违反严格别名规则)。 可能结果是*f
是指向地址0x00000001
的指针。
然后使用%d
打印指针,导致进一步的未定义行为。 您看到1
因为您的系统使用相同的方法将int
传递给printf
就像传递int *
。
当你将(int *)0x00000001
加1时,得到(int *)0x00000005
,因为递增指针意味着指向该类型的下一个元素。
当您取消引用此指针时,它会导致段错误,因为该地址超出了您的有效地址空间。
1) int **p = b
与int (*p)[3] = b
? – 编号int **p = b
是错误。
因为这里int **p
是指向整数的指针,但是int (*p)[3]
是指向3个整数数组的指针!
2) int **f = B;
这是一个错误,可能导致未定义的行为!
3) printf("%d ",**f);
– 与(2)相同。 int **f = B;
是错误,所以未定义的行为!
注意:为避免此类错误,请在编译器选项中启用一些警告标志并尝试!
以上就是c/c++开发分享指针指针和指向2d数组的指针之间的区别相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/562502.html