2011-02-17 74 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]和一個是代表結構的基地址是等效的。