如何解决为什么Struct名称不是C中的指针?
数组名称是指针,函数名称也是指针,但Struct名称不是指针。我试图了解这种差异背后是否存在某些逻辑推理,或者仅仅是C语言的随机语法?
解决方法
只有一个或一个数组或函数实例,因此我们可以指向它们。但是,结构可以有很多实例,因此我们不能指向结构,但是可以指向结构实例。
,数组很奇怪。它们的行为不像其他类型。
C源自较早的名为B 1 的语言,该语言维护了指向数组第一个元素的单独指针。有了声明
auto a[10];
您将在内存中得到以下内容:
+–––+
a: | | ––+
+–––+ |
... |
+–––––+
|
v
+–––+
| | a[0]
+–––+
| | a[1]
+–––+
...
+–––+
| | a[9]
+–––+
数组下标操作a[i]
被定义为*(a+i)
-给定存储在a
中的起始地址,偏移量i
元素(不是字节 )并从该地址取消引用。
在设计C时,Ritchie希望保留B的数组语义,但是他不想保留指向第一个元素的单独指针,因此他放弃了它-而是创建了最终被标准化的规则,如下所示:
6.3.2.1左值,数组和函数指示符C 2011 Online Draft
...
3除外,它是sizeof
运算符,_Alignof
运算符或一元&
运算符的操作数,或者是用于初始化数组的字符串文字,其类型为`` type 的数组''被转换为类型为``pointer to type ''的表达式,该表达式指向数组对象的初始元素,并且不是左值。如果数组对象具有register
存储类,则该行为未定义。
当您使用C声明数组时,例如
int a[10];
您在内存中得到了这个
+---+
a: | | a[0]
+---+
| | a[1]
+---+
...
+---+
| | a[9]
+---+
没有为单独的指针对象分配空间。下标操作a[i]
仍被定义为*(a + i)
,只是在这种情况下,表达式a
从数组类型转换为指针类型,作为计算的一部分。
这很重要-数组名a
不是指针。而是将表达式 a
根据需要从数组类型转换为指针类型。
函数也有类似的规则:
4 功能指示符是具有功能类型的表达式。除非是同上。sizeof
运算符,_Alignof
运算符, 65)或一元&
运算符, 类型为“函数返回类型”的函数指示符将转换为类型为“函数返回 type 的指针”的表达式。
65)因为没有发生这种转换,所以sizeof或_Alignof运算符的操作数保持不变 一个功能指示符,并且违反了6.5.3.4中的约束。
结构类型不能像数组那样工作-不会根据与基地址的数字偏移量来访问成员。有一种完全不同的机制在起作用,因此struct foo
表达式不会“衰减”到与数组表达式或函数指定符相同的指针类型。
- 如果您真的有兴趣,可以在this article中阅读Ritchie自己开发C的描述。
我认为主要原因是与数组相反的结构(和联合)类型的对象具有赋值运算符。
例如,您可以写
struct A a1;
struct A a2;
a1 = a2;
如果结构类型的对象会衰减为指针,则这种分配将毫无意义。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。