2012-08-07 46 views
6

Vui lòng làm gì dưới đây?Trên con trỏ và tham chiếu C++, cần làm rõ

Đó là sự hiểu biết của tôi rằng một con trỏ đại diện cho một địa chỉ của một cái gì đó của một số loại.

Vì vậy, int i = 18, một con trỏ đến nó là int *pI = &i;

2 tờ khai sau đây là hợp lệ

void foo (int &something) // Will accept an address of something 
void bar (int *something) // Will accept a pointer to something 

Khi chúng ta khai báo một chức năng như

void bar (int *something) 

Chúng tôi tốt hơn gửi một con trỏ đến một cái gì đó. Thật vậy, foo(pI) hoạt động.

Tiếp theo cùng một logic, khi nhìn vào

void foo (int &something) 

Chúng ta nên gửi nó trở thành một địa chỉ của một cái gì đó trỏ đến một int như một cuộc tranh cãi, vì vậy sau đó:

Tại sao foo(&i) sai?

Trả lời

5

void foo (int &something) // Will accept an address of something

này là không chính xác: int& là một tài liệu tham khảo , một khái niệm tương tự như con trỏ theo những cách nhất định, nhưng không phải ở tất cả giống hệt nhau.

Tham chiếu tương tự như con trỏ trong đó một giá trị có thể được thay đổi thông qua tham chiếu, giống như nó có thể được thay đổi thông qua con trỏ. Tuy nhiên, không có những thứ như "tham chiếu null", trong khi con trỏ NULL rất phổ biến.

Khi bạn gọi một chức năng mà phải mất một tài liệu tham khảo, bạn chỉ cần vượt qua biến tham chiếu mà bạn đang dùng - không điều hành & được yêu cầu:

void foo (something); // "something" must be a variable 
2

Việc kê khai void foo (int &something) mất một reference variable, không phải là một con trỏ .

Bạn gọi chính xác giống như bạn gọi void foo (int something), ngoại trừ somethingpassed by reference, không phải by value.

0

void foo (int & một cái gì đó) // có chấp nhận một địa chỉ của một cái gì đó

Không, mặc dù tôi có thể hiểu được sự nhầm lẫn. Hàm đó có tham chiếu đến int. Tài liệu tham khảo được đảm bảo là không null trong một chương trình được xác định rõ ràng. Nó tương tự như khái niệm với một con trỏ, nhưng khác về mặt ngữ nghĩa.

Để gọi hàm đó, bạn không cần phải làm gì đặc biệt.

int i = 10; 
foo(i); // passed to foo by reference 
0

Bởi vì trong C++ các & có nghĩa là "loại tài liệu tham khảo" trong bối cảnh của một nguyên mẫu chức năng như bạn đang sử dụng nó ở đây. Chức năng của bạn:

void foo (int &something) 

là thực sự xác định rằng một loại nguyên liệu tham khảo nên được thông qua, vì vậy bạn chỉ đơn giản là sẽ gọi hàm này như sau:

foo(i); 

Lưu ý rằng trong trường hợp này bạn vẫn đang đi qua địa chỉ của i vào hàm, nhưng bạn đang làm nó như một kiểu tham chiếu chứ không phải là một con trỏ thô.

0

hai ý nghĩa khác nhau cho &.

Đầu tiên là tạo con trỏ từ biến hiện có.

Thứ hai là thực hiện tham chiếu.

Mặc dù cả hai đều sử dụng cùng một ký tự, chúng là hai thứ hoàn toàn khác nhau.

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