2010-01-28 73 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