2012-07-09 35 views
6

Tôi mới với tất cả lập trình C và tôi có một câu hỏi,cách sao chép con trỏ để trỏ trên cùng một đối tượng

Nếu tôi có cấu trúc - và tôi đang chỉ vào nó, Tôi muốn tạo một con trỏ mới để trỏ vào cùng một dữ liệu, nhưng không phải cho hai con trỏ trỏ vào cùng một đối tượng. làm cách nào tôi có thể làm điều đó mà không cần sao chép mọi trường đơn lẻ trong cấu trúc?

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

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

và bây giờ tôi muốn b đến điểm trên cùng một dữ liệu

b = *a 

đó là không đúng, và trình biên dịch được la hét vào tôi

bất kỳ trợ giúp sẽ là tuyệt vời! cảm ơn bạn :)

Trả lời

10

Điều đầu tiên, mã của bạn không chính xác. Bạn tạo một con trỏ có tên a, nhưng bạn không tạo bất kỳ thứ gì cho nó trỏ đến. Bạn không được phép dereference nó (với a->x) cho đến khi nó trỏ đến một cái gì đó.

Khi bạn thực sự có một số cấu trúc cho con trỏ của bạn để trỏ đến, sau đó bạn có thể sao chép chúng bằng cách chuyển nhượng:

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

tại sao nó * b = * a chứ không phải b = * a? Tôi không thể hiểu được sự khác biệt giữa: b = a, * b = a, b = * a, * b = * a. tôi có thể xin giải thích ngắn gọn không? – user1386966

+3

@ user1386966: 'a' và' b' là con trỏ. '* a' và' * b' là những thứ mà chúng trỏ đến. Bạn muốn sao chép điều được trỏ đến bởi 'a', đối với thứ được trỏ đến bởi' b'. Do đó bạn viết '* b = * a'. 'b = a' thay đổi con trỏ' b' để có cùng giá trị với 'a', đó là một cách khác để nói thay đổi' b' để trỏ đến cùng một điều mà 'a' trỏ tới. 'b = * a' và' * b = a' là vô nghĩa, bởi vì bạn không thể tạo cấu trúc bằng một con trỏ. –

+1

Thông thường của tôi tương tự, btw, là một con trỏ giống như một mảnh giấy với một địa chỉ đường phố được viết trên đó. Điều nó trỏ đến (aka "referand") giống như một tòa nhà. Bạn sẽ không nhầm lẫn một tòa nhà ('* b)' với thứ gì đó có địa chỉ của tòa nhà được viết trên đó ('b'). '* b = * a' có nghĩa là" xây dựng một tòa nhà tại địa chỉ trên 'b', và làm cho nó giống như tòa nhà có địa chỉ trên' a' ". 'b = a' có nghĩa là" sao chép địa chỉ được viết trên 'a' sang' b' ". Sự tương tự hơi yếu đi khi bạn lưu ý rằng trong C bạn có thể lấy một con trỏ tới 'a' - thậm chí cả mảnh giấy có thể có địa chỉ riêng của chúng trong C. –

1

Chức năng memcpy() sao chép một khối dữ liệu từ vị trí này sang vị trí khác. Để phù hợp với câu hỏi của bạn, bạn sẽ thực hiện:

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

-1 không sử dụng 'memcpy' khi bạn chỉ có thể gán các đối tượng với' * b = * a'. –

Các vấn đề liên quan