2012-12-30 51 views
4

可能重複: 「」
Arrow operator (->) usage in C「 - >」和「。」之間的區別用C

我試圖找出之間的差異和「 - >」的C語言數據訪問風格。例如,

struct div{ 
    int quo; 
    int rem; 
}; 

1)使用 「 - >」

struct div *d = malloc(sizeof(struct div)); 
d->quo = 8/3; 
d->rem = 8%3; 
printf("Answer:\n\t Quotient = %d\n\t Remainder = %d\n-----------\n",d->quo,d->rem); 

2)使用 「」

struct div d; 
d.quo = 8/3; 
d.rem = 8%3; 
printf("Answer:\n\t Quotient = %d\n\t Remainder = %d\n-----------\n",d.quo,d.rem); 

我得到了這兩種情況相同的輸出。

答:智商= 2餘數= 2

如何這兩種方法是內部的工作?什麼時候應該使用哪一個? 我試過在互聯網上搜索它,但幫助不大。任何相關的鏈接也表示讚賞。

他們在內存中的存儲還有什麼區別嗎?

+0

有這個問題反過來_StackOverflow_地方一個完美的答案,讓我覺得它現在.. –

+0

[這是另一個解釋](http://stackoverflow.com/questions/1238613/what-is-the-difference-between-the-dot-o perator-and-in-c)在C++上下文中的差異(C部分仍然存在)。 –

+0

你的回答在於你的問題本身。它不在'.'和' - >'之間,而是數據訪問的上下文。 – NeonGlow

回答

10

基本區別在於:

. is the member of a structure 
-> is the member of a POINTED TO structure 

所以,當有一個直接訪問變量在結構中的.使用。但是,當通過指向該結構的指針訪問結構變量時使用->

說你有結構a

struct a{ 
    int b; 
} 

但是說c是一個指向a那麼你知道:c = (*a)。結果->正被用作.的某種情況的替代方案。所以不要做(*a).b,你可以做c->b,這是完全一樣的。

2

在處理指向結構的指針時,請使用->,並在直接使用它們時使用.

7

->中的.

也就是說定義的,a->b相當於(*a).b,所以你會明顯地得到相同的結果。

->爲了方便而存在。

2

當您需要手動管理創建的對象的生命週期時,使用第一種方法。當創建的對象的生存期限制在創建它的範圍或包含它的對象的範圍內時,請使用第二種方法。

+0

它們在內存中的存儲有什麼區別嗎? –

+0

@AtulGupta:這取決於實施。一般來說,'new'將在堆上分配,聲明一個特定範圍內的對象將分配堆棧上的分配時間內已知的內容以及稍後在堆上動態分配的內容。 –

+0

我的理解是,在這種情況下(1)由於我使用的是malloc,所以struct d * d的內存將被分配在堆上。而在(2)的情況下,它將被分配到堆棧上。如果我錯了,請糾正我。 –

2

在C中,->.非常相似,但涉及指針。在結構中,.用於直接引用結構中的成員,而->用於引用指向結構的成員。根據情況,使用指針或不使用指針的結果幾乎相同。

a -> b相同(*a).b

認爲它像a = a + 1。爲了簡單和方便,a++用於實現相同的確切結果。

1

當時被使用,它被稱爲結構構件..

並且當- 使用>,它被稱爲指針構件..

如果使用指針構件,它可以怎麼過解決這樣的..

X - > y和(* X).Y都是相同..