双const声明

时间:2010-01-28 16:56:42

标签: c++ function const

我经常看到以下函数声明:

some_func(const unsigned char * const buffer)
{

}

知道为什么在指针名称之前重复const?

感谢。

8 个答案:

答案 0 :(得分:20)

第一个const表示指向的数据是常量,可能不会更改,第二个表示指针本身可能不会更改:

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 :(得分:8)

类型声明应该(?)读取RTL。 const修改了左侧的内容,但由于您可以同时编写const TT const(它们的含义相同),因此规则很复杂。

  • T * const是指向可变T
  • 常量指针
  • T & const将是对可变T 的常量引用,除了引用按定义不变
  • T const *是指向常量T
  • 可变指针
  • T const &对常量T
  • 的引用
  • T const * const常量指针T

答案 2 :(得分:3)

它是一个指向常量unsigned char的常量指针。你不能改变指针,也不能改变它指向的东西。

答案 3 :(得分:3)

const * const T之类的声明中,第一个const*之前)意味着指向的指针是const(即它是指向const T的指针。 const之后的*表示指针本身const(即无法修改为指向任何其他位置)。

您可以从向外声明的对象中读取声明,因此const unsigned char * const buffer读作:“buffer是指向const unsigned char的const指针”(这就是为什么const应始终放置的原因修改之后 - 之前,你需要重新排列事物来制作句子 - 将其声明为unsigned char const * const buffer,翻译成英文简单直接(或者“直截了当” “,因为在这种情况下你实际上从右到左阅读。”

答案 4 :(得分:2)

假设const unsigned char * const

每个人都是正确的,它是一个指向const unsigned char的const指针。

C ++类型主要读取从右到左,除非最左边有任何修饰符,然后从左到右读取。

答案 5 :(得分:1)

这使得它成为const值的const指针,而不是指向const值的可变指针或指向可变值的const指针。

答案 6 :(得分:1)

const * unsigned char const buffer表示您无法修改指针buffer,也无法修改buffer指向的内存。

答案 7 :(得分:1)

一些文章可以帮助您理解C ++中的const正确性: