2011-01-07 41 views
7

Con trỏ được truyền vào tham chiếu. Tại sao? không phải là con trỏ chỉ tham chiếu anyways? Điều gì thực sự xảy ra với tham số này?Con trỏ C++ (Vượt qua tham chiếu) Câu hỏi

void someFunc(MyPtr*& Object) 
{ 

} 
+1

"không phải con trỏ chỉ tham chiếu đến anyways?" - có một chút mơ hồ ở đây. Trong thuật ngữ khoa học máy tính nói chung, con trỏ là một loại tham chiếu.Tuy nhiên C++ sử dụng cùng một từ, "tham chiếu", có nghĩa là một tính năng ngôn ngữ cụ thể. Tham chiếu C++ cũng là một kiểu tham chiếu, nhưng chúng là một tham chiếu * khác nhau * và con trỏ không phải là tham chiếu C++. –

+0

@ Steve Jessop: 1 lý do tương tự cũng khiến tôi viết câu trả lời của mình. Ref Vs Pointer tài liệu trực quan đẹp mắt -> http://www.dgp.toronto.edu/~patrick/csc418/wi2004/notes/PointersVsRef.pdf dường như nó sẽ luôn gây ra nhiều rắc rối. Điều tương tự là trong C# nhưng rất nhiều poeple không nhận ra thậm chí còn có một vấn đề - thực sự nó phức tạp hơn, sau đó c + + vượt qua bởi ref & pass bởi giá trị đi bởi vì nó có các lớp logic trên các khái niệm C++. Quá ít người nhận ra C# thực sự là phức tạp hơn sau đó C + + khi nói đến những gì là "con trỏ" (không nói về mã không an toàn ở tất cả ở đây) – user44298

+0

cont. Nhưng nó thực sự đơn giản, mặt khác, nếu bạn nghĩ về nó như thế này: khi máy tính lưu trữ dữ liệu (một biến chẳng hạn) dữ liệu chỉ có 2 đặc điểm: (1) một địa chỉ trong memeory & (2) value được viết tại địa chỉ đó . Đó là bất kỳ dữ liệu nào. Con trỏ & tham chiếu và trừu tượng như vậy được giới thiệu để thuận tiện. Bất kỳ phương tiện nào lưu trữ dữ liệu như DVD chẳng hạn giống như một cuốn sách giấy: bạn có một trang mà bạn có một câu được viết - nó cũng giống như vậy - bạn phải viết (1) thông tin (2) ở đâu đó. Giấc mơ, mặt khác có thể phức tạp hơn nhiều so với lưu trữ đi :) – user44298

Trả lời

7

Nói một cách đơn giản, nó cung cấp cho bạn khả năng thay đổi chính con trỏ: nó có thể được thay đổi để trỏ đến vị trí khác trong hàm. Và thay đổi sẽ được phản ánh bên ngoài.

1

Khác sẽ phải bỏ phiếu để xác minh nguyên nhân này tôi hơi mệt mỏi với C++ của tôi nhưng tôi tin ý tưởng ở đây là bạn sẽ vượt qua con trỏ bằng cách tham khảo, thay vì tạo một không gian mới để lưu trữ con trỏ chính nó bạn sử dụng một tham chiếu đến con trỏ vì vậy nếu bạn đã sửa đổi con trỏ không chỉ giá trị nó sẽ được sửa đổi sau khi trở về từ hàm, trong khi nếu không thì tất cả những gì bạn có thể làm là sửa đổi giá trị tại vị trí được truyền vào. .

0

Nó cũng có nghĩa là con trỏ có thể là 0 (NULL) có thể có ý nghĩa với phương pháp. Tham chiếu phải luôn hợp lệ và không thể được thực hiện 'không có gì'

1

Sự khác biệt khi chỉ chuyển con trỏ là nếu con trỏ bị thay đổi (Object = x) thì chức năng gọi sẽ được thay đổi. Bạn có thể đạt được điều tương tự khi bạn vượt qua MyPtr** Object và dereference con trỏ *Object = x;. Với cách tiếp cận thứ hai, bạn có thể truyền NULL cho hàm. Điều này là không thể cho tài liệu tham khảo.

5

Nó cho phép bạn:

void someFunc(MyPtr*& Object) 
{ 
    //Modify what Object is pointing to 
    Object=&old_Object; 

    //You can also allocate memory, depending on your requirements 
    Object=new MyPtr; 

    //Modify the variable Object points to 
    *Object=another_object; 
} 
+0

Chúng ta không bị rò rỉ bộ nhớ trong tình huống trên? – Mahesh

+1

@Mahesh Không, miễn là người gọi biết nó phải xóa đối tượng mới khi nó kết thúc với nó – trojanfoe

1

Bạn đang không hoàn toàn đúng. Con trỏ nội dung được truyền bằng tham chiếu nhưng chính con trỏ vẫn được truyền theo giá trị, nghĩa là gán lại con trỏ cho một số con trỏ khác sẽ không được phản ánh khi thoát khỏi phương thức vì con trỏ sẽ được đặt để trỏ đến cùng một khối bộ nhớ trước cuộc gọi. Hãy nghĩ về nó như một biến int đơn giản. Tuy nhiên với & * hoặc ** bạn có thể gán lại con trỏ và con trỏ đó sẽ hiển thị bên ngoài phạm vi của phương pháp này.

1

Tại sao?

Vì lý do tương tự bạn sẽ chuyển vào bất kỳ điều gì khác bằng cách tham chiếu.

không phải con trỏ chỉ tham chiếu đến anyways?

Thưa Chúa, không. Thậm chí không điều khiển từ xa. Hãy xem, bạn có thể thử để xây dựng mô hình tinh thần của tham chiếu theo số bắt đầu bằng con trỏ, nhưng vào thời điểm bạn đã sửa tất cả sự khác biệt, bạn có một mớ hỗn độn vô lý khủng khiếp.

Tham khảo là một khái niệm đơn giản và trực quan hơn nhiều, và chỉ có "lý do lịch sử" để cố gắng hiểu con trỏ trước chúng. Hiện đại C++ sử dụng con trỏ thô chỉ hiếm khi, và xử lý chúng như là một chi tiết thực hiện càng nhiều càng tốt.

Tham chiếu là một tên khác cho một điều đã tồn tại. Đó là nó. Khi được sử dụng như một tham số hàm, do đó chúng cho phép hàm được gọi để tham chiếu đến dữ liệu của người gọi.

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