写C++的时候,经常和指针打交道。有时候传个指针,担心函数里不小心改了数据;有时候拿到一个指针,想明确告诉别人“别动它”。这时候,const就派上用场了,尤其是在指针操作中,它的用法有点绕,但搞明白后特别实用。
const修饰指针的几种写法
比如你有个整型变量,想通过指针访问它,但不想让它被修改。这时候可以这样写:
const int* ptr = &value;
这表示ptr指向一个const int,也就是指针指向的内容不能改。你可以改变ptr的指向,但不能通过ptr去修改它指向的值。
反过来,如果你希望指针本身不能变,但内容可以改,就这么写:
int* const ptr = &value;
这时候ptr一旦指向某个地址,就不能再指向别的地方了,但可以通过ptr修改value的值。
最严格的写法是两者都加const:
const int* const ptr = &value;
既不能改指向,也不能改内容。这种在回调函数或者多线程共享数据时特别有用,能避免误操作。
实际场景里的应用
想象你在写一个日志系统,有个函数专门打印缓冲区内容。你传进去一个指针,当然不希望这个函数偷偷改了你的数据。这时候接口就可以定义成:
void print_log(const char* msg);
调用的人一看就知道,这个函数不会修改msg指向的内容,用起来更放心。
再比如,你在维护一段老代码,看到一个参数是 const std::string*,马上就能判断出:这个指针指向的字符串不会被修改。阅读代码的时候,这种信息能帮你快速理解逻辑,减少出错。
小技巧:从右往左读更容易理解
面对复杂的指针const修饰,有个小技巧:从变量名开始,从右往左读。
比如 int* const ptr,就是“ptr是一个const指针,指向int”;而 const int* ptr 是“ptr是一个指针,指向const int”。这样一拆解,就不容易晕。
这些细节看起来不起眼,但在团队协作和长期维护中,能大大减少bug的产生。特别是多人共用的头文件里,把该加的const都加上,等于给代码加了层说明文档。