繁体   English   中英

为什么结构名称不是 C 中的指针?

[英]Why Struct name is not a pointer in C?

数组名称是指针,function 名称也是指针,但结构名称不是指针。 我试图了解这种差异背后是否有一些逻辑推理,或者它只是 C 语言的随机语法?

数组或 function 的实例只有一个,所以我们可以指向它们。 但是,结构可以有很多实例,所以我们不能指向结构,但可以指向结构实例。

Arrays 很奇怪。 它们的行为与其他类型不同。

C 派生自一种名为 B 1的早期语言,它维护一个指向数组第一个元素的单独指针。 鉴于声明

auto a[10];

你会在 memory 中得到如下内容:

   +–––+
a: |   | ––+
   +–––+   |
    ...    |
     +–––––+
     |
     v
   +–––+
   |   | a[0]
   +–––+
   |   | a[1]
   +–––+
    ...
   +–––+
   |   | a[9]
   +–––+

数组下标操作a[i]被定义为*(a+i) - 给定存储在a中的起始地址,从该地址偏移i个元素(不是字节)并取消引用结果。

在设计 C 时,Ritchie 想保留 B 的数组语义,但他不想保留指向第一个元素的单独指针,所以他去掉了它 - 相反,他创建了最终标准化的规则如下:

6.3.2.1 左值、arrays 和 function 指示符
...
3 除非它是sizeof运算符、 _Alignof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,否则类型为 ''array of type '' 的表达式将转换为表达式类型“指向类型”的指针指向数组 object 的初始元素,并且不是左值。 如果数组 object 具有register存储 class,则行为未定义。
C 2011年在线草案

当您在 C 中声明一个数组时

int a[10];

你在 memory 中得到这个:

 +---+ a: | | a[0] +---+ | | a[1] +---+... +---+ | | a[9] +---+

没有为单独的指针 object 分配空间。 下标操作a[i]仍然定义为*(a + i) ,只是在这种情况下,表达式a作为计算的一部分从数组类型转换为指针类型。

这很重要——数组名a不是指针 相反,表达式a根据需要从数组类型转换为指针类型。

函数也有类似的规则:

4 function 指示符是具有 function 类型的表达式。 除非它是sizeof运算符、 _Alignof运算符65)或一元&运算符的操作数,否则类型为“函数返回类型”的 function 指示符将转换为类型为“指向 function 返回类型的指针”的表达式''。
65) 由于没有发生这种转换,sizeof 或 _Alignof 运算符的操作数仍然是 function 指示符,违反了 6.5.3.4 中的约束。
同上。

结构类型不像 arrays 那样工作 - 不会根据与基地址的数字偏移量来访问成员。 有一种完全不同的机制在起作用,因此struct foo表达式不会像数组表达式或 function 指示符那样“衰减”为指针类型。


  1. 如果你真的有兴趣,可以阅读这篇文章里奇自己开发C的记述。

我认为主要原因是与 arrays 相对的结构(和联合)类型的对象具有赋值运算符。

所以例如你可以写

struct A a1;
struct A a2;
a1 = a2;

如果结构类型的 object 将衰减为指针,则此分配将没有意义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM