编辑:最初的单词选择令人困惑。 “象征性”这个词比原来的(“神秘的”)要好得多。
在关于我之前的 C++ 问题的讨论中,我被告知指针是
- "类似于整数的简单值类型 https://stackoverflow.com/questions/32043314/overwriting-an-object-with-an-object-of-same-type/32043636#comment51987347_32043314"
- not "mystical https://stackoverflow.com/questions/32043314/overwriting-an-object-with-an-object-of-same-type/32043636#comment51988103_32043636"
- "位模式(对象表示)包含普通可复制类型的值(值表示)(第 3.9/4 节),指针就是这样的类型。 https://stackoverflow.com/questions/32043314/overwriting-an-object-with-an-object-of-same-type/32043636#comment51987714_32043636"
这确实not听起来不错!如果没有任何东西是象征性的并且指针是其表示,那么我可以执行以下操作。我可以吗?
#include <stdio.h>
#include <string.h>
int main() {
int a[1] = { 0 }, *pa1 = &a[0] + 1, b = 1, *pb = &b;
if (memcmp (&pa1, &pb, sizeof pa1) == 0) {
printf ("pa1 == pb\n");
*pa1 = 2;
}
else {
printf ("pa1 != pb\n");
pa1 = &a[0]; // ensure well defined behaviour in printf
}
printf ("b = %d *pa1 = %d\n", b, *pa1);
return 0;
}
这是一个C 和C++ 问题。
测试用在线编译和执行C http://www.tutorialspoint.com/compile_cpp_online.php使用 GNU GCC v4.8.3:gcc -O2 -Wall
gives
pa1 == pb
b = 1 *pa1 = 2
测试用在线编译和执行C++ http://www.tutorialspoint.com/compile_cpp_online.php使用 GNU GCC v4.8.3:g++ -O2 -Wall
pa1 == pb
b = 1 *pa1 = 2
So 的修改b
via (&a)[1]
fails与 C 和 C++ 中的 GCC 一起使用。
当然,我想要一个基于标准报价的答案。
编辑:回应对 UB 的批评&a + 1
, now a
是一个包含 1 个元素的数组。
有关的:取消引用包含对象(数组的数组)地址的出界指针 https://stackoverflow.com/questions/32043795/dereferencing-an-out-of-bound-pointer-that-contains-the-address-of-an-object-ar
附加说明:我认为“神秘”一词首先由托尼·德尔罗伊使用here https://stackoverflow.com/questions/32043314/overwriting-an-object-with-an-object-of-same-type/32043636#comment51988103_32043636。我借错了。