c – 指针变量只是与某些运算符整数还是“符号”?

编辑:原始的单词选择令人困惑.术语“象征性”比原始术语(“神秘”)要好得多.

在关于我之前的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.

相关文章

首先GDB是类unix系统下一个优秀的调试工具, 当然作为debug代...
1. C语言定义1个数组的时候, 必须同时指定它的长度.例如:int...
C++的auto关键字在C+⬑新标准出来之前基本...
const关键字是用于定义一个不该被改变的对象,它的作用是告诉...
文章浏览阅读315次。之前用C语言编过链表,这几天突然想用C+...
文章浏览阅读219次。碰到问题就要记录下来,防止遗忘吧。文章...