2012-07-09 36 views
6

我是新與所有的C語言編程,我有一個問題點上,如何複製指針,以相同的對象

如果我有例如結構 - 我指着它,我想創建一個新的指針,以指向相同的數據,但不是指向同一個對象的兩個指針。 如何在不復制結構中的每個字段的情況下做到這一點?

typedef struct 
{ 
int x; 
int y; 
int z; 
}mySTRUCT; 

mySTRUCT *a; 
mySTRUCT *b; 
a->x = 1; 
a->y = 2; 
a->z = 3; 

,現在我想2b對同一數據

b = *a 

這不是正確的點,編譯器在我吼

任何幫助將是巨大的!謝謝:)

回答

10

首先,您的代碼不正確。你創建一個指針,命名爲a,但是你不會創建任何東西來指向它。你不能取消引用它(與a->x),直到它指向某個東西。

一旦你確實有一些結構爲你的指針指向,那麼你可以通過分配複製它們:

myStruct a_referand = {0}; 
myStruct b_referand = {0}; 
myStruct *a = &a_referand; 
myStruct *b = &b_referand; 

a->x = 1; 
*b = *a; // copy the values of all members of a_referand to b_referand 
// now b->x is 1 
b->x = 2; 
// now b->x is 2 but a->x is still 1 
+0

爲什麼它* b = * a而不是b = * a?我無法理解之間的區別:b = a,* b = a,b = * a,* b = * a。我可以得到一個簡短的解釋嗎? – user1386966 2012-07-09 12:06:35

+3

@ user1386966:'a'和'b'是指針。 '* a'和'* b'是他們指向的東西。你想把'a'指向的東西複製到'b'指向的東西上。因此你寫'* b = * a'。 'b = a'將指針'b'改變爲與'a'具有相同的值,這是改變'b'指向與'a'指向相同的東西的另一種方式。 'b = * a'和'* b = a'是沒有意義的,因爲你不能使一個結構等於一個指針。 – 2012-07-09 12:27:24

+1

我常用的比喻,順便說一句,指針就像一張寫着街道地址的紙。它指向的東西(又名「referand」)就像一座建築物。你不會把建築物('* b)'與寫有建築物地址的東西混淆('b')。 '* b = * a'的意思是「在'b'上的地址上建造建築物,並使其與地址爲'a'的建築物相同。 'b = a'的意思是「將寫在'a'上的地址複製到'b'」。當你注意到在C語言中,你可以用一個指針指向'a' - 甚至可以在C中使用自己的地址。 – 2012-07-09 12:49:50

1

memcpy()函數將數據塊從一個位置複製到另一個位置。要解決您的問題,您需要執行以下操作:

memcpy(b, a, sizeof(*b)); 
+1

-1不使用'memcpy'時,你只是可以用'分配對象* b = * a'。 – 2012-07-09 12:35:33

相關問題