2011-02-17 41 views
1

例如,我有“A”如以下结构的数组:有关使用阵列作为C中指针的问题

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

'some_var-> a [0] - > b'应该是'some_var-> a [0] .b' – Keith 2011-02-17 05:43:07

+0

@Keith您正在使用错误的字符作为代码。这是一个“[Grave Accent](http://en.wikipedia.org/wiki/Grave_accent)”```。 – 2011-02-17 05:54:24

回答

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

假设你已经为some_var分配了内存,它可以安全地做some_var->a->b(当数组衰减到指针时)。

+0

是分配了some_var的内存。好,谢谢你,我只需要确认 – smam 2011-02-17 06:36:41

-1

是,_var->a[0]->b_var->a->b

由于a[0]和一个是代表结构的基地址是等效的。