例如。我有一系列结构'a'如下:
struct mystruct{
int b
int num;
};
struct bigger_struct {
struct my_struct a[10];
}
struct bigger_struct *some_var;
我知道当用作值时数组的名称隐含地引用数组的第一个元素的地址。(数组下标运算符的工作方式至少是这样) 我可以知道反过来,即 如果我这样做:
some_var->a->b
,它应该相当于some_var->a[0]->b
,我是对的吗?我已经测试了这个并且似乎有效,但这在语义上是100%正确的吗?
答案 0 :(得分:8)
some_var->a->b
是否等同于some_var->a[0]->b
?
不,它相当于some_var->a[0].b
。
数组到指针转换的确切规范实际上非常简单:
除非它是
sizeof
运算符或一元&
运算符的操作数,否则是 用于初始化数组的字符串文字,类型为数组类型为的表达式将转换为类型为指向类型的指针,指向数组对象的初始元素并且不是左值(C99 6.3.2.1)。
some_var->a
的类型为my_struct[10]
,这是一种数组类型,因为它不是sizeof
或一元&
运算符的操作数,也不是字符串在文字中,它被转换为指向数组初始元素的指针。
答案 1 :(得分:-1)
假设您为some_var
分配了内存,可以安全地执行some_var->a->b
(因为数组会衰减成指针)。
答案 2 :(得分:-1)
是的,_var->a[0]->b
和_var->a->b
是等效的
因为a[0]
和a表示结构的基址。