我经常看到以下函数声明:
some_func(const unsigned char * const buffer)
{
}
知道为什么在指针名称之前重复const?
感谢。
答案 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 T
和T 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正确性: