2010-01-28 74 views
8

我經常看到下面的函數聲明:雙常量聲明

some_func(const unsigned char * const buffer) 
{ 

} 

任何想法,爲什麼const爲指針名前重複?

謝謝。

+0

它應該是'const的無符號字符* const' – wich 2010-01-28 16:58:58

+3

IIRC無符號的字符常量* const的也是有效的 – 2010-01-28 17:26:32

+0

不,你沒有看到這樣的聲明「經常」。該聲明實際上是無效的,因此是沒有意義的。請在發佈帶有問題的代碼時加倍小心。 – AnT 2010-01-28 17:33:47

回答

17

第一個常量說,所指向的數據是不變的,不得改變,第二個表示指針本身不可更改:

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但是我可能會建議添加一些例子,說明可能不會重新分配const指針。 (即char * const x = NULL; x =&some_char;') – Eric 2010-01-28 17:12:07

+0

@Eric我相信我已經包含了'b =&other_char; // error' – wich 2010-01-28 17:16:40

+0

我相信我需要多加關注:)我的歉意 – Eric 2010-01-28 17:21:59

1

這使得它成爲一個const值的const指針,而不是指向const值的可變指針或指向可變值的const指針。

3

這是一個常數指針,指向一個常數無符號字符。你不能改變指針或它指向的東西。

1

const * unsigned char const buffer意味着您不能修改指針buffer,也不能修改buffer指向的內存。

2

在像const * const T聲明,第一const(在*之前)意味着什麼指針指向const(即它是一個指向const T)。在*之後的const意味着指針本身const(即,不能被修改爲指向任何其他)。

2

假設const爲unsigned char * const

大家都是正確的,它是一個const指針,指向一個const無符號字符。

C++類型主要讀取從右到左除非在最左邊有任何修飾符,然後這些從左到右讀取。

7

類型聲明應該(?)讀取RTL。 const修改其左側的東西,但規則很複雜,因爲您可以同時寫入const TT const(它們的意思是相同的)。

  • T * const恆定指針可變Ť
  • T & const恆定參照可變Ť,除了參考文獻是由定義常量
  • T const *可變指針常數T
  • T const &參考常數T
  • T const * const常數指針常數T
+0

謝謝,RTL閱讀建議對於這些特性情況很有用。 – SyBer 2010-01-29 22:13:03