2010-03-17 56 views
0
struct struct0 { 
    int a; 
}; 

struct struct1 { 
    struct struct0 structure0; 
    int b; 
} rho; 


&rho->structure0; /* Reference 1 */ 
(struct struct0 *)rho; /* Reference 2 */ 
(struct struct0)rho; /* Reference 3 */ 
  1. 從參考文獻1,並編譯器採取RHO的地址,然後訪問structure0,或反之亦然?運算符優先級和結構定義用C

  2. 參考文獻2中的界限是什麼?

  3. 由於structure0是struct1的第一個成員,因此引用3是否等同於引用1?

回答

4

在你的推薦順序:

  1. ->&更高的優先級。您將獲得rho->structure0的地址。或者說,你會如果rho是一個指針。由於沒有,你會得到一個編譯錯誤。
  2. 這將無法正常工作 - 您正在將結構強制轉換爲指針類型 - 您應該得到編譯器錯誤。
  3. 你也不能這樣做。對非標量類型的類型轉換也是一個錯誤。

你的實施例#2和#3是由標準6.5.4節所覆蓋:

除非類型名稱指定的空隙類型,類型名,須指明合格或不合格 標量類型和操作數應該有標量類型。

如果你把任何代碼放到編譯器中,你會看到相同的結果;你顯示的代碼不是你打算詢問的內容?

+0

如果rho的第一個成員是一個指針,那麼引用1和2是否相等? – Yktula 2010-03-17 02:02:07

+1

@Yttula,不,他們仍然無法工作。 'rho'本身必須是一個指針來嘗試任何這些東西。 – 2010-03-17 02:07:37

+0

你說得對。 struct s1 {struct {int n} * s0; } * s1; main(){(&s1-> sch ==(struct s0 *)s1)? printf(「Yes」):退出(EXIT_FAILURE);返回0; }打印是。謝謝。 – Yktula 2010-03-17 02:22:00

2
&rho->structure0; /* Reference 1 */ 
(struct struct0)rho; /* Reference 3 */ 
(struct struct0 *)rho; /* Reference 2 */ 

所有三個參考是不正確的:

  • RHO不是指針。所以你不能 做rho->structure0(&rho)->structure0
  • 你不能一個變量轉換爲 指針,所以你不能這樣做(struct struct0)rho;(struct struct0 *)&rho

我很真的不明白你想要做什麼,所以我幫不了你。