Không dereferencing một con trỏ và đi qua đó đến một chức năng mà tham số của nó bằng cách tham khảo tạo một bản sao của đối tượng?Không dereferencing một con trỏ tạo một bản sao của nó?
Trả lời
Trong trường hợp này giá trị tại con trỏ được sao chép (mặc dù điều này không nhất thiết phải là trường hợp như trình tối ưu hóa có thể tối ưu hóa nó ra).
int val = *pPtr;
Trong trường hợp này tuy nhiên không có bản sao sẽ diễn ra:
int& rVal = *pPtr;
Lý do không có bản sao xảy ra là do một tài liệu tham khảo không phải là một cấu trúc máy cấp mã. Nó là một cấu trúc mức cao hơn và do đó là một cái gì đó trình biên dịch sử dụng nội bộ hơn là tạo ra mã cụ thể cho nó.
Tương tự, rõ ràng, dành cho các tham số chức năng.
Nó không phải là con trỏ được sao chép trong trường hợp đầu tiên. Đó là giá trị nó trỏ đến đó được sao chép. Trong trường hợp thứ hai, con trỏ được sao chép (logic) và giá trị không phải là. –
@Sergey: Các điểm tốt được phát âm rất khó :) – Goz
Tôi đã viết một chương trình thử nghiệm đơn giản để xác minh câu trả lời cho chính mình, hy vọng điều này sẽ giúp một số http://codepad.org/XDqahndf – RishiD
Hy vọng nó không: nếu hàm được gọi nhận đối số của nó theo giá trị.
Hơn nữa, đó là hành vi mong đợi của một tài liệu tham khảo:
void inc(int &i) { ++i; }
int main()
{
int i = 0;
int *j = &i;
inc(*j);
std::cout << i << std::endl;
}
Mã này được dự kiến sẽ in 1
vìinc
mất đối số của nó bằng cách tham khảo. Đã có bản sao được thực hiện khi cuộc gọi inc
, mã sẽ in 0
.
Không. Một tham chiếu ít nhiều giống như một con trỏ với ký hiệu khác nhau và hạn chế không có tham chiếu null. Nhưng giống như một con trỏ nó chỉ chứa địa chỉ của một đối tượng.
"Nhưng giống như một con trỏ nó chỉ chứa địa chỉ của một đối tượng." Tham chiếu không có sự tồn tại của riêng nó. Nó chỉ là một bí danh đối tượng mà nó đã được khởi tạo. Vì vậy, nói rằng "nó chứa" địa chỉ sẽ là sai. Tham chiếu chỉ trỏ đến cùng một địa chỉ với đối tượng gốc, nó không chứa địa chỉ đó. –
Tại sao không? Làm thế nào nó có thể trỏ đến đâu đó và không chứa địa chỉ? Nó có chứa nó, chỉ có bạn không thể truy cập vào địa chỉ nó chứa bởi vì nó tự động bị hủy đăng ký bất cứ khi nào bạn truy cập nó. –
@Sergey Tachenov: Trình biên dịch phải tạo ra tiểu thuyết rằng đó là bí danh và có thể giả định nó. Điều này có nghĩa là tùy thuộc vào việc sử dụng, trình biên dịch có thể tạo ra một con trỏ * nội bộ * và tự động dereference nó sử dụng, hoặc trong một số trường hợp nó chỉ có thể tham khảo các đối tượng ban đầu hoàn toàn. Trong hầu hết các trường hợp, nó phải dùng đến con trỏ, nhưng vào cuối ngày, bạn tốt hơn suy nghĩ theo thuật ngữ trừu tượng: tham chiếu là * bí danh * bất kể chúng được triển khai như thế nào. –
Trong trường hợp đơn giản, không. Có những trường hợp phức tạp hơn, mặc dù:
void foo(float const& arg);
int * p = new int(7);
foo(*p);
Ở đây, một đối tượng tạm thời được tạo ra, vì kiểu của con trỏ dereferenced (int
) không phù hợp với loại hình cơ bản của tham số chức năng (float
). Một chuỗi chuyển đổi tồn tại và tạm thời được chuyển đổi có thể bị ràng buộc với arg
vì đó là tham chiếu const.
- 1. Dereferencing một con trỏ đến một mảng?
- 2. char ** và dereferencing con trỏ
- 3. Iterator cho vector của con trỏ không dereferencing chính xác
- 4. Con trỏ trỏ tới một bản đồ
- 5. Khởi tạo một con trỏ
- 6. Con trỏ dereferencing có phải là nguyên tử không?
- 7. Tại sao một con trỏ thông minh không thể gọi hàm new() cho tôi trong hàm tạo của nó?
- 8. Tốc độ dereferencing C cấu trúc con trỏ
- 9. Cú pháp cho dereferencing một con trỏ trong C (hoặc C++)
- 10. Chỉ định tham chiếu theo dereferencing con trỏ NULL
- 11. Cách tạo bản sao của uiview (không phải là con trỏ đến uiview gốc)
- 12. Tại sao đây là một con trỏ
- 13. Tại sao con trỏ yếu không thể truy cập con trỏ cơ bản?
- 14. Một mảng của con trỏ trỏ đến cùng một mảng
- 15. Tại sao di chuyển một biến con trỏ không đặt nó thành null?
- 16. Tại sao không thể lưu trữ một con trỏ hàm của một lớp cơ sở?
- 17. Tạo con trỏ để trỏ đến một mảng
- 18. malloc một mảng của con trỏ struct
- 19. Đó có phải là một rò rỉ bộ nhớ để push_back một con trỏ vào một vector của con trỏ?
- 20. Viết bản sao sâu - sao chép giá trị con trỏ
- 21. con trỏ const gán cho một con trỏ
- 22. Tại sao con trỏ "này" trong C++ là một con trỏ chứ không phải là một tham chiếu?
- 23. Tai nạn trên thiết bị iOS khi dereferencing một con trỏ trở về bởi decodeBytesForKey của NSCoderer
- 24. Con trỏ của một số chức năng
- 25. Tại sao tham số endptr để strtof và strtod một con trỏ đến một con trỏ char không const?
- 26. Buffer.BlockCopy vs bản sao con trỏ byte không an toàn *
- 27. Tại điểm nào dereferencing con trỏ null trở thành hành vi không xác định?
- 28. Tìm số 'dòng' (con trỏ) trong một văn bản
- 29. Tại sao 'this' là một con trỏ chứ không phải là một tham chiếu?
- 30. dereferencing con trỏ không phá vỡ quy tắc anti-aliasing nghiêm ngặt sử dụng socket Berkeley
Re: tiêu đề. Nếu dereferencing một con trỏ thực hiện một bản sao của đối tượng, nó sẽ không thể không bao giờ sử dụng các đối tượng ?! – visitor