2010-01-28 30 views
8

Tôi thường thấy các khai báo hàm sau:khai const đúp

some_func(const unsigned char * const buffer) 
{ 

} 

Bất cứ ý tưởng tại sao const được lặp lại trước tên con trỏ?

Cảm ơn.

+0

Nó nên được 'char unsigned const * const' – wich

+3

iirc unsigned const char * const cũng là hợp lệ –

+0

Không, bạn không thấy tuyên bố đó "thường". Tuyên bố, trên thực tế, không hợp lệ và do đó không có ý nghĩa. Vui lòng thận trọng hơn khi đăng mã bằng các câu hỏi của bạn. – AnT

Trả lời

17

Các const đầu tiên nói rằng các dữ liệu chỉ ra là không đổi và có thể không được thay đổi , thứ hai nói rằng con trỏ có thể không thay đổi:

char my_char = 'z'; 
const char* a = &my_char; 
char* const b = &my_char; 
const char* const c = &my_char; 

a = &other_char; //fine 
*a = 'c'; //error 
b = &other_char; //error 
*b = 'c'; //fine 
c = &other_char; //error 
*c = 'c'; //error 
+1

+1 Nhưng tôi có thể đề nghị thêm các ví dụ chứng minh rằng con trỏ const không thể được gán lại. (ví dụ: 'char * const x = NULL; x = & some_char;') – Eric

+0

@Eric Tôi tin rằng tôi đã bao gồm 'b = & other_char; // error' – wich

+0

Tôi tin rằng tôi cần chú ý hơn :) Lời xin lỗi của tôi – Eric

1

Điều này làm cho nó trở thành một con trỏ const thành một giá trị const, chứ không phải là một con trỏ có thể thay đổi thành một giá trị const hoặc một con trỏ const đến một giá trị có thể thay đổi.

3

Đó là một con trỏ liên tục đến một ký tự không dấu liên tục. Bạn không thể thay đổi con trỏ hay thứ mà nó trỏ tới.

1

const * unsigned char const buffer có nghĩa là bạn không thể sửa đổi con trỏ buffer hoặc bộ nhớ mà buffer trỏ tới.

2

Trong một tuyên bố như const * const T, các const đầu tiên (trước khi *) có nghĩa là những gì các con trỏ trỏ tạiconst (ví dụ đó là một con trỏ đến một const T). const sau * có nghĩa là con trỏ chính nóconst (tức là không thể sửa đổi để trỏ vào bất kỳ thứ gì khác).

2

giả sử const unsigned char * const

Mọi người đều chính xác rằng con trỏ const của nó là một ký tự không dấu.

Loại C++ đọc chủ yếu là từ phải sang trái trừ khi có bất kỳ công cụ sửa đổi nào ở phía bên trái, sau đó đọc từ trái sang phải.

7

tuyên bố loại phải (?) Được đọc RTL. const sửa đổi điều ở bên trái của nó, nhưng quy tắc phức tạp bởi thực tế là bạn có thể viết cả hai const TT const (chúng có nghĩa là cùng một điều).

  • T * const là một con trỏ liên tục để T có thể thay đổi
  • T & const sẽ tài liệu tham khảo liên tục để có thể thay đổi T, ngoại trừ tài liệu tham khảo là không đổi theo định nghĩa
  • T const * là một con trỏ có thể thay đổi để liên tục T
  • T const & là tham chiếu liên tục T
  • T const * constcon trỏ liên tục để ổn định T
+0

Cảm ơn, lời khuyên đọc RTL rất hữu ích cho các trường hợp tính năng như vậy. – SyBer