2010-02-25 88 views
33

Sự khác nhau giữa con trỏ không đổi và tham chiếu là gì?Sự khác biệt giữa const. con trỏ và tham chiếu?

Con trỏ không đổi như tên ngụ ý không thể bị ràng buộc lại. Tương tự là trường hợp với tham chiếu.

Tôi tự hỏi loại kịch bản nào sẽ được ưu tiên hơn so với trường hợp khác. Làm thế nào khác nhau là tiêu chuẩn C + + của họ và triển khai của họ?

cổ vũ

Trả lời

43

Có 3 loại con trỏ const:

//Data that p points to cannot be changed from p 
const char* p = szBuffer; 

//p cannot point to something different. 
char* const p = szBuffer; 

//Both of the above restrictions apply on p 
const char* const p = szBuffer; 

Phương pháp # 2 ở trên là giống nhất với một tham chiếu.

Có sự khác biệt quan trọng giữa tài liệu tham khảo và tất cả 3 loại con trỏ const trên:

  • con trỏ Const có thể NULL.

  • Tham chiếu không có địa chỉ riêng trong khi con trỏ.
    Địa chỉ của tham chiếu là địa chỉ của đối tượng thực tế.

  • Một con trỏ có địa chỉ riêng và nó giữ giá trị của nó là địa chỉ của giá trị mà nó trỏ đến.

  • Xem my answer here for much more differences between references and pointers.

+2

Ngoài ra, tham chiếu là một _alias_ cho một đối tượng. Điều này có nghĩa rằng một tham chiếu có thể được sử dụng mà không có dereferencing (tha thứ cho thuật ngữ khó hiểu). –

6

Tôi giả sử bạn có nghĩa là con trỏ có giá trị const (ví dụ: int * const ptr), không phải con trỏ đến const (ví dụ: int const * ptr).

  • Không khởi tạo một tài liệu tham khảo được một lỗi biên dịch (tránh các vấn đề của con trỏ uninitialized)
  • Một con trỏ cũng có thể trỏ đến một mảng, hoặc nó có thể là NULL, nơi một tham chiếu luôn đề cập đến chính xác một đối tượng.
  • Cú pháp là rất khác nhau
+0

Bạn ** có thể tham chiếu đến phần tử mảng: 'int & intRef (intArray [2]);'. Một con trỏ const trỏ đến một mảng điểm đến địa chỉ của một phần tử mảng. Tôi không chắc chắn phần mảng của viên đạn thứ hai của bạn có nghĩa là nhiều. Có lẽ bạn có nghĩa là bạn có thể sử dụng toán tử '[]' trên một con trỏ. – thebretness

0

Một số khác biệt:

Một con trỏ const có thể trỏ đến NULL.

Điểm const có thể trỏ đến một mảng đối tượng.

Một con trỏ const có thể bị ràng buộc lại bằng cách bỏ đi độ chói.

+0

Một con trỏ có thể trỏ đến phần tử đầu tiên của một mảng các đối tượng .... Bạn có thể có một kiểu con trỏ mảng bằng nhau và tham chiếu đến một kiểu như vậy. –

+0

Const đúc nên cực kỳ hiếm, cũng hợp lý, và cũng tài liệu. Rất nhiều đúc trộn với chức năng bình thường thường là một triệu chứng của một thiết kế kém. – thebretness

+0

Loại bỏ độ chói và ghi vào một biến không đổi cho một lỗi phân đoạn ở đây, vì vậy nó chắc chắn không phải là một ý tưởng hay. Hằng số nằm trên nhiều hệ thống được lưu trữ trên một vùng nhớ chỉ đọc riêng biệt, hoặc các giá trị của chúng có thể được thay thế trực tiếp thành các phép tính bằng trình biên dịch, tránh đọc hoàn toàn. – Tronic

6

Khi bạn nên sử dụng mỗi:

tham khảo: Sử dụng các theo mặc định. Nó là rất phổ biến cho mọi người để dereference NULL con trỏ. Bạn loại bỏ nguy cơ đó bằng một tham chiếu.

const pointer: Khi bạn muốn tham chiếu nhưng không thể tạo một tham chiếu. Ví dụ, bạn đang viết một trình điều khiển, và bạn muốn một con trỏ đến đầu của một bản đồ bộ nhớ.Một tham chiếu không có ý nghĩa nhiều trong trường hợp đó. Ngoài ra, nếu bạn cần một mảng của sự vật, một tham chiếu sẽ không hoạt động (mặc dù một mảng các lớp đơn giản với các thành viên tham khảo sẽ).

Trong ví dụ sau, một con trỏ const kiểm tra một lỗi mà một tài liệu tham khảo không thể kiểm tra:

int addFour(int* register){ 
    if(isNull(arg)){ 
    throw NullPointerException(); 
    } 

    // some stuff 
    *register += 4; 

    return register; 
} 

// This could be any function that does pointer math. 
bool isNull(const int* ptr){ 
    return(NULL == ptr); 
} 
2

Hầu như tất cả các điểm đã được bao phủ bởi câu trả lời khác, trừ trường hợp này quan trọng nhất: Có thể làm arithmetics trên con trỏ, nhưng không phải trên tham chiếu. Ví dụ:

int a[3] = {39, 18, 97}; 
int * const b = a; 
int c = *(b+1); // sets c = 18 
Các vấn đề liên quan