2011-12-20 37 views
37

Possible Duplicate:
What are the differences between pointer variable and reference variable in C++?
Are there benefits of passing by pointer over passing by reference in C++?Băng qua con trỏ & Vượt qua tham chiếu

Trong cả hai trường hợp, tôi đạt được kết quả. Vì vậy, khi nào được ưa thích hơn người kia? Những lý do chúng tôi sử dụng cái nào khác?

#include <iostream> 
using namespace std; 
void swap(int* x, int* y) 
{ 
    int z = *x; 
    *x=*y; 
    *y=z; 
} 
void swap(int& x, int& y) 
{ 
    int z = x; 
    x=y; 
    y=z; 
} 

int main() 
{ 
    int a = 45; 
    int b = 35; 
    cout<<"Before Swap\n"; 
    cout<<"a="<<a<<" b="<<b<<"\n"; 

    swap(&a,&b); 
    cout<<"After Swap with pass by pointer\n"; 
    cout<<"a="<<a<<" b="<<b<<"\n"; 

    swap(a,b); 
    cout<<"After Swap with pass by reference\n"; 
    cout<<"a="<<a<<" b="<<b<<"\n"; 
} 

Output

Before Swap 
a=45 b=35 
After Swap with pass by pointer 
a=35 b=45 

After Swap with pass by reference 
a=45 b=35 
+0

http://stackoverflow.com/questions/114180/pointer-vs-reference –

+0

[Có lợi ích khi chuyển qua con trỏ qua khi tham chiếu trong C++ không?] (Http://stackoverflow.com/q/334856/ 187543) – cpx

Trả lời

23

Một tài liệu tham khảo được ngữ nghĩa như sau:

T& <=> *(T * const)

const T& <=> *(T const * const)

T&& <=> [no C equivalent] (C++ 11)

Như với các câu trả lời khác, câu hỏi sau từ Câu hỏi thường gặp C++ là câu trả lời một dòng: các tham chiếu khi có thể, các con trỏ khi cần.

Lợi thế hơn con trỏ là bạn cần truyền rõ ràng để vượt qua NULL. Nó vẫn có thể, mặc dù. Trong số các trình biên dịch tôi đã thử nghiệm, không phát ra một lời cảnh báo cho những việc sau:

int* p() { 
    return 0; 
} 
void x(int& y) { 
    y = 1; 
} 
int main() { 
    x(*p()); 
} 
+1

Tài liệu tham khảo không hạn chế đối tượng tham chiếu để đề cập đến nội dung nào đó hợp lệ. Ví dụ: bạn có thể trả lại tham chiếu đến biến cục bộ. –

+1

Có thể nhận được một tham chiếu không hợp lệ nếu bạn dereference một con trỏ NULL, vì vậy bạn vẫn cần phải cẩn thận trong mã gọi. Xem http://stackoverflow.com/questions/57483/what-are-the-differences-between-pointer-variable-and-reference-variable-in-c/57656#57656 –

+0

Có thể, nhưng trừ khi bạn đang hội nghị con trỏ không được kiểm soát, sau đó nó sẽ không xảy ra. Và nếu bạn không kiểm tra con trỏ trước khi dereferencing chúng, sau đó tôi có tin tức cho bạn ... – moshbear

4

đèo bởi con trỏ là cách duy nhất bạn có thể vượt qua "bằng cách tham khảo" trong C, vì vậy bạn vẫn thấy nó được sử dụng khá nhiều .

Con trỏ NULL là một quy ước tiện dụng để nói tham số không được sử dụng hoặc không hợp lệ, vì vậy hãy sử dụng con trỏ trong trường hợp đó.

Không thể cập nhật tài liệu tham khảo khi chúng được thiết lập, vì vậy hãy sử dụng con trỏ nếu bạn cần gán lại nó.

Ưu tiên tham chiếu trong mọi trường hợp không có lý do chính xác. Làm cho nó const nếu bạn có thể.

6

Thực tế, hầu hết các trình biên dịch đều phát ra cùng mã cho cả hai hàm gọi, bởi vì các tham chiếu thường được thực hiện bằng cách sử dụng con trỏ.

Theo logic này, khi một đối số của loại tham chiếu (không const) được sử dụng trong phần thân hàm, mã được tạo sẽ chỉ hoạt động âm thầm trên địa chỉ của đối số và nó sẽ coi trọng nó. Ngoài ra, khi một cuộc gọi đến một chức năng như vậy là gặp phải, trình biên dịch sẽ tạo ra mã mà đi qua địa chỉ của các đối số thay vì sao chép giá trị của chúng.

Về cơ bản, tài liệu tham khảo và gợi ý không phải là rất khác nhau từ một điểm thực hiện xem, sự khác biệt chính (và rất quan trọng) là trong triết lý: một tham chiếu là đối tượng chính nó, chỉ với một cái tên khác.

Tham chiếu có một vài ưu điểm hơn so với con trỏ (ví dụ: chúng không thể là NULL, vì vậy chúng an toàn hơn để sử dụng). Do đó, nếu bạn có thể sử dụng C++, sau đó đi qua tham chiếu thường được coi là thanh lịch hơn và nó nên được ưa thích. Tuy nhiên, trong C, không có tham chiếu, vì vậy nếu bạn muốn viết mã C (hoặc, dictu khủng khiếp, mã biên dịch với cả trình biên dịch C và C++, mặc dù đó không phải là ý hay), bạn sẽ phải hạn chế bản thân để sử dụng con trỏ.

4

Here là một bài viết tốt về vấn đề này - "Sử dụng tài liệu tham khảo khi bạn có thể, và con trỏ khi bạn phải làm vậy."

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