关于在C中使用数组作为指针的问题

时间:2011-02-17 05:36:59

标签: c arrays pointers struct

例如。我有一系列结构'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%正确的吗?

3 个答案:

答案 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表示结构的基址。