2013-07-02 59 views
11

Bất kỳ ai có thể cho tôi biết sự khác biệt chính xác giữa cuộc gọi bằng con trỏ và gọi bằng tham chiếu. Trên thực tế những gì đang xảy ra trên cả hai trường hợp?Khác biệt giữa cuộc gọi theo tham chiếu và gọi bằng con trỏ

Ví dụ:

Gọi Bằng cách tham khảo:

void swap(int &x, int &y) 
{ 
    int temp; 
    temp = x; /* save the value at address x */ 
    x = y; /* put y into x */ 
    y = temp; /* put x into y */ 

    return; 
} 

swap(a, b); 

Gọi Bằng con trỏ:

void swap(int *x, int *y) 
{ 
    int temp; 
    temp = *x; /* save the value at address x */ 
    *x = *y; /* put y into x */ 
    *y = temp; /* put x into y */ 

    return; 
} 

    swap(&a, &b); 
+3

Trong java không có con trỏ. –

+2

Tại sao thẻ được gắn thẻ * java *? – Nawaz

+0

Câu hỏi này không liên quan gì đến Java. –

Trả lời

13

Cả hai trường hợp đều chính xác như nhau.

Tuy nhiên, sự khác biệt nhỏ là, tham chiếu không bao giờ rỗng (và bên trong hàm bạn chắc chắn, rằng chúng đang tham chiếu biến hợp lệ). Mặt khác, con trỏ có thể trống hoặc có thể trỏ đến vị trí không hợp lệ trong bộ nhớ, gây ra AV.

+0

Điều gì sẽ là tham chiếu của 'x' trong cuộc gọi sau:' swap (* (int *) 0, y) '? –

+0

@ValeriAtamaniouk sẽ là hành vi không xác định. – juanchopanza

+0

@ValeriAtamaniouk Điều quan trọng, nó sẽ là một hành vi không xác định * ngay cả trước khi vào chức năng *. – Spook

0

Trong ví dụ của bạn, không có sự khác biệt.

Trong tham chiếu C++ được triển khai bằng con trỏ.

Edit: cho những ai tin tham khảo không thể là NULL:

int calc(int &arg) 
{ 
    return arg; 
} 

int test(int *arg) 
{ 
    return calc(*arg); 
} 

Guess, điều gì sẽ là kết quả cho test(0)?

+3

... ngoại trừ các con trỏ có thể là NULL và tham chiếu không thể ... – trojanfoe

+0

@trojanfoe Tham chiếu có thể trỏ tới NULL. Mặc dù nó không phải là một trường hợp phổ biến. –

+0

Vui lòng hiển thị mã cho điều đó. – trojanfoe

3

Các cuộc gọi ngữ nghĩa này có kết quả giống nhau; dưới tham chiếu mui xe được thực hiện với con trỏ.

Sự khác biệt quan trọng giữa việc sử dụng tài liệu tham khảo và con trỏ là với các tham chiếu bạn có ít sợi dây hơn để treo mình. Tài liệu tham khảo luôn luôn trỏ đến "một cái gì đó", nơi mà con trỏ có thể trỏ đến bất cứ điều gì. Ví dụ: hoàn toàn có thể làm điều gì đó như thế này

void swap(int *x, int *y) 
{ 
    int temp; 
    temp = *x; /* save the value at address x */ 
    ++x; 
    *x = *y; /* put y into x */ 
    *y = temp; /* put x into y */ 

    return; 
} 

Và bây giờ mã này có thể làm bất cứ điều gì, sập, chạy, có con khỉ bay ra khỏi mọi thứ.

Khi nghi ngờ, hãy tham khảo. Chúng là mức trừu tượng cao hơn, an toàn hơn trên con trỏ.

0

Mã của bạn là mã C++. Trong Java không có con trỏ. Cả hai ví dụ đều làm điều tương tự, chức năng không có sự khác biệt.

0

Tôi không biết chính xác lý do tại sao thẻ này được gắn thẻ là không có con trỏ. Tuy nhiên, đối với khái niệm bạn có thể sử dụng cả hai con trỏ và tham chiếu thay thế cho nhau nếu bạn đang làm việc trên thuộc tính value. ví dụ i = 4 hoặc * i = 4. Ưu điểm của việc sử dụng con trỏ là bạn có thể thao tác với chính địa chỉ đó. Đôi khi bạn sẽ cần phải sửa đổi địa chỉ (trỏ nó đến cái gì khác ...) đây là khi con trỏ khác nhau để tham khảo; con trỏ cho phép bạn làm việc trực tiếp trên địa chỉ, tham chiếu sẽ không

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