Như mọi người khác đã đề cập, trong tham chiếu triển khai và con trỏ phần lớn là giống nhau. Có một số hãy cẩn thận nhỏ:
Bạn không thể gán NULL đến một tài liệu tham khảo (shoosh đề cập này): đó là đáng kể vì không có "không xác định" hoặc "không hợp lệ" tài liệu tham khảo giá trị .
Bạn có thể vượt qua một biến tạm thời như một const tham khảo, nhưng nó không hợp pháp để vượt qua một con trỏ để tạm thời.
Ví dụ, đây là okay:
class Thingy; // assume a constructor Thingy(int,int)
void foo(const Thingy &a)
{
a.DoSomething();
}
void bar()
{
foo(Thingy(1,2));
}
nhưng hầu hết các trình biên dịch sẽ phàn nàn về
void foo2(Thingy * a);
void bar2()
{
foo(&Thingy(1,2));
}
- Lấy địa chỉ của một biến để có được một con trỏ buộc các trình biên dịch để lưu nó vào bộ nhớ. Chỉ định tham chiếu đến biến cục bộ vừa tạo một từ đồng nghĩa; trong một số trường hợp, điều này có thể cho phép trình biên dịch giữ dữ liệu trên thanh ghi và tránh load-hit-store. Tuy nhiên, điều này chỉ áp dụng cho các biến cục bộ - khi một thứ gì đó được chuyển thành tham số bằng tham chiếu, không tránh né lưu nó vào ngăn xếp.
void foo()
{
int a = 5;
// this may be slightly more efficient
int &b = a;
printf("%d", ++b);
// than this
int *c = &a;
printf("%d", ++(*c));
}
Tương tự, __restrict keyword không thể được áp dụng cho tài liệu tham khảo, chỉ có con trỏ. Bạn không thể làm số học con trỏ với các tham chiếu, vì vậy trong khi nếu bạn có một con trỏ vào một mảng thì phần tử tiếp theo trong mảng có thể có thông qua p + 1, một tham chiếu chỉ bao giờ có điểm tại một điểm trong nó. toàn bộ cuộc sống.
Bạn thực sự có thể gán NULL đến một tài liệu tham khảo NẾU bạn bỏ nó vào một con trỏ của các loại và sau đó dereference điểm ví dụ int & ref = * (int *) NULL; và bạn cũng có thể gán lại một tham chiếu nếu bạn đặt nó trong một liên minh và thay đổi giá trị tương ứng trong liên minh. –
Và tôi nên thêm rằng những điều này sẽ không bao giờ được thực hiện vì khi một hàm yêu cầu tham chiếu, nó không bao giờ mong đợi NULL, và mặc dù hầu hết các tham chiếu về cơ bản được thực hiện giống như con trỏ, đây không phải là trường hợp trong tất cả các kịch bản/nền tảng. –
nếu bạn đang gán cho một giá trị tương ứng của một công đoàn thì bạn không thực sự gán cho một tham chiếu là bạn? – shoosh