2011-08-15 39 views
26

Tại sao là 90 giá trị đầu ra là yq? Tôi chỉ làm p=q. Giá trị của q bị thay đổi như thế nào?Chỉ định con trỏ C++

int main() 
{ 

    int x; 
    int y; 
    int *p = &x; 
    int *q = &y; 

    x = 35; 
    y = 46; 

    p = q; 

    *p = 90; 

    cout << x << " " << y << endl; 
    cout << *p << " " << *q << endl; 
    cout << "Address of p = " << p << endl; 
    cout << "Address of q = " << q << endl; 

    return 0; 
} 

Đầu ra là:

35 90 
90 90 
Address of p = 0xbffa83c0 
Address of q = 0xbffa83c0 

Trả lời

78

tôi muốn chia sẻ một kỹ thuật chung mà tôi sử dụng để học cách con trỏ làm việc khi tôi đã bắt đầu. Nếu bạn áp dụng nó cho vấn đề của mình, bạn sẽ thấy câu trả lời đơn giản như ngày.

Lấy một tờ giấy lớn và đặt nó dọc theo chiều dài trên bàn trước mặt bạn. Đây là bộ nhớ máy tính của bạn. Mỗi hộp đại diện cho một byte. Chọn một hàng và đặt số '100' bên dưới hộp ở phía xa bên trái. Đây là "địa chỉ thấp nhất" của bộ nhớ. (Tôi đã chọn 100 là số tùy ý không phải là 0, bạn có thể chọn số khác.) Đánh số các ô theo thứ tự tăng dần từ trái sang phải.

 
+---+---+---+---+---+-- 
| | | | | | ... 
+---+---+---+---+---+-- 
100 101 102 103 104 ... 

Bây giờ, chỉ trong giây lát, giả vờ một kích thước là một byte. Bạn là một máy tính tám bit. Viết số int a của bạn vào một trong các hộp. Số bên dưới hộp là địa chỉ của nó. Bây giờ, hãy chọn một hộp khác để chứa int *b = &a. int *b cũng là một biến được lưu trữ ở đâu đó trong bộ nhớ, và nó là một con trỏ có chứa &a, được phát âm là "địa chỉ của một".

int a = 5; 
int *b = &a; 
 
    a  b 
+---+---+---+---+---+-- 
| 5 | |100| | | ... 
+---+---+---+---+---+-- 
100 101 102 103 104 ... 

Bây giờ bạn có thể sử dụng mô hình này để làm việc trực quan thông qua bất kỳ kết hợp khác của các giá trị và gợi ý mà bạn thấy. Đó là một sự đơn giản hóa (vì như người đọc ngôn ngữ sẽ nói, con trỏ không phải là nhất thiết phải là một địa chỉ và bộ nhớ không phải là nhất thiết phải là tuần tự, và ngăn xếp và đống và đăng ký, v.v.) tương tự cho 99% máy tính và vi điều khiển.

Vì vậy, trong trường hợp của bạn,

int x = 35; 
int y = 46; 
 
    x y 
+---+---+---+---+---+-- 
| 35| 46| | | | ... 
+---+---+---+---+---+-- 
100 101 102 103 104 ... 
int *p = &x; 
int *q = &y; 
 
    x y p q 
+---+---+---+---+---+-- 
| 35| 46|100|101| | ... 
+---+---+---+---+---+-- 
100 101 102 103 104 ... 
p = q; 
 
    x y p q 
+---+---+---+---+---+-- 
| 35| 46|101|101| | ... 
+---+---+---+---+---+-- 
100 101 102 103 104 ... 
*p = 90; 
 
    x y p q 
+---+---+---+---+---+-- 
| 35| 90|101|101| | ... 
+---+---+---+---+---+-- 
100 101 102 103 104 ... 

Bây giờ là những gì *p? *q là gì?

+8

Một câu trả lời rất thanh lịch. Khi tôi đã học C/C++, bạn tôi đã cho tôi một gợi ý để gọi * p là "nội dung của p" và nó trở nên rất rõ ràng sau đó. – lud0h

7

q là địa chỉ của y. Và sau p=q, p cũng trở thành địa chỉ của y. Đó là lý do tại sao pq in cùng một địa chỉ khi bạn in chúng bằng cách sử dụng cout.

Nói cách khác, cả hai pq trỏ đến cùng một biến y. Vì vậy, nếu bạn thay đổi giá trị của bất kỳ y, *p hoặc *q, thì thay đổi sẽ xảy ra trong tất cả, vì tất cả đều giống nhau!

4

Giá trị của q không thay đổi, q vẫn trỏ đến y. Tuy nhiên, p trỏ đến y quá sau p = q, do đó, *p về bản chất là y*p = 90 gán cho y.

Lưu ý rằng cout << "Address of p = " << p << endl; là gây hiểu lầm: p và địa chỉ p là hai con thú khác nhau.

Vì vậy, mã của bạn chạy như thế này:

int main() { 

    int x; 
    int y; 
    int *p = &x; // now p points to x 
    int *q = &y; // now q points to y 

    x = 35; 
    y = 46; 

    p = q;  // now p is the same as q, i.e., points to y 

    *p = 90;  // p points to y, so *p is y. 
       // so we assign 90 to y 

    cout << x << " " << y << endl; 
    cout << *p << " " << *q << endl; // both *p and *q are y 
    cout << "Address of p = " << p << endl; 
    cout << "Address of q = " << q << endl; 

    return 0; 
} 
1

Khi bạn đặt p=q, cả hai đều tham chiếu cùng một vị trí bộ nhớ. Do đó, nếu bạn thay đổi giá trị được trỏ đến bởi p, nó cũng sẽ thay đổi giá trị được trỏ đến bởi q, là địa chỉ của y. Do đó, đầu ra của y, *p*q giống nhau.

2

sau khi thực hiện 'p = q;' tuyên bố, hai con trỏ trỏ đến cùng một biến thể 'y'. Vì vậy, khi thực hiện '* p = 90;', giá trị của biến thể 'y' được thay đổi.

1

Trước tiên, bạn xác định p làm con trỏ trỏ đến x. Và sau đó xác định q là một con trỏ trỏ y. Sau đó, bạn đã viết p = q, vì vậy bây giờ, p và q cả hai sẽ trỏ đến y.

OK, thay đổi * p, có nghĩa là thay đổi y. sau đó bạn gán 90 cho y theo dòng * p = 90;

Bây giờ, bạn có điều này:

  • y: 90
  • p điểm để y
  • điểm q để y
  • * p: 90
  • * q: 90
2
int x;int y;int *p = &x;int *q = &y;x = 35;y = 46; 

Ie p point s đến x (35) và q điểm để y (46)

p = q; 

Bây giờ p điểm để y (46)

*p = 90; 

Bây giờ các nội dung của p (aka y) = 90

Bây giờ x = 35, y = 90, p và q điểm đến y

cout << x << " " << y << endl; 

Prints x, y tức là 35 và 90

cout << *p << " " << *q << endl; 

p và q điểm để điều tương tự - y - có giá trị là 90 vì 90 và 90 là đầu ra

cout << "Address of p = " << p << endl;cout << "Address of q = " << q << endl; 

Như p và q là cùng một địa chỉ sẽ ra giá trị như nhau.

4

Vâng chúng ta hãy nhìn vào nó sau mỗi bước:

int x; 
int y; 

Bây giờ chúng ta có hai biến xy:

int *p = &x; 
int *q = &y; 

Có được khai báo hai biến khác, con trỏ p trỏ tới biến x và chứa địa chỉ và con trỏ của nó q trỏ đến biến số y và chứa địa chỉ của nó:

x = 35; 
y = 46; 

Ở đây bạn gán giá trị cho các biến, đây là rõ ràng:

p = q; 

Bây giờ bạn gán địa chỉ lưu trữ trong q để biến p vì vậy cả hai biến điểm để giải quyết trong q là những gì địa chỉ của y:

*p = 90; 

Tại đây bạn dereference p, có thể thay đổi theo địa chỉ trong p và nó là y và bạn chỉ định giá trị 90 cho biến số y.

2

Xem anotations:

int main() 
{ 
int x; 
int y; 
int *p = &x; 
int *q = &y; 

x = 35; 
y = 46; 

p = q;  // at this point p is now pointing to the same memory address 
      // as q, both of them are pointing to the memory allocated to y 

*p = 90; // this will also change the values in *q and y 

cout << x << " " << y << endl; 
cout << *p << " " << *q << endl; 
cout << "Address of p = " << p << endl; 
cout << "Address of q = " << q << endl; 

return 0; 
}