c – 指针变量只是与某些运算符整数还是“符号”?
编辑:原始的单词选择令人困惑.术语“象征性”比原始术语(“神秘”)要好得多.
在关于我之前的C问题的讨论中,我被告知指针是 >“a simple value type much like an integer” 这听起来不错!如果没有任何符号,并且指针是其表示,那么我可以执行以下操作.我可以吗? #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 == pbn"); *pa1 = 2; } else { printf ("pa1 != pbn"); pa1 = &a[0]; // ensure well defined behaviour in printf } printf ("b = %d *pa1 = %dn",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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |