在关于我之前的C问题的讨论中,我被告知指针是
>“a simple value type much like an integer”
>不是“mystical”
>“The Bit pattern (object representation) contains the value (value representation) (§3.9/4) for trivially copyable types, which a pointer is.”
这听起来不错!如果没有任何符号,并且指针是其表示,那么我可以执行以下操作.我可以吗?
#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问题.
使用GNU GCC v4.8.3进行Compile and Execute C Online测试:gcc -O2 -Wall给出
pa1 == pb b = 1 *pa1 = 2
使用GNU GCC v4.8.3进行Compile and Execute C++ Online测试:g -O2-Wall
pa1 == pb b = 1 *pa1 = 2
因此,通过(& a)[1]的b修改在C和C中的GCC失败.
当然,我想根据标准报价给出答案.
编辑:为了回应关于UB on& a 1的批评,现在a是一个1元素的数组.
相关:Dereferencing an out of bound pointer that contains the address of an object (array of array)
补充说明:我认为,“神秘”一词最初是由Tony Delroy here使用的.我借用它是错误的.
C被认为是一种语言,其中指针和整数非常密切相关,确切的关系取决于目标平台.指针和整数之间的关系使得该语言非常适合于低级或系统编程.出于以下讨论的目的,我将这种语言称为“低级别C”[LLC].C标准委员会编写了一种不同语言的描述,这种关系没有明确禁止,但没有以任何有用的方式得到承认,即使实现为目标和应用领域生成代码,这种关系也是有用的.我将这种语言称为“仅限高级别C”[HLOC].
在编写标准的时代,大多数自称C实现的事情都处理了LLC的方言.最有用的编译器处理一种方言,该方言在比HLOC更多的情况下定义了有用的语义,但没有LLC那么多.指针表现得更像整数还是更像抽象神秘实体,取决于使用哪种精确方言.如果正在进行系统编程,那么将C视为将指针和整数视为密切相关是合理的,因为适合于该目的的LLC方言是这样做的,而不这样做的HLOC方言不适用于该目的.然而,当进行高端数字运算时,人们更常使用HLOC的方言,这些方言不能识别这种关系.
真正的问题,以及如此争论的根源在于LLC和HLOC越来越不同,但两者都被称为C.