const int p用于函数参数确保只读访问,因非常量指针int暗示可修改,故不能接收const对象地址,这是编译期类型安全机制。

函数参数中只读访问数组或对象时,必须用 const T*,否则无法传入字面量、临时对象或 const 对象地址
为什么 void func(int* p) 不能接收 &const_val?
编译器会拒绝这种调用,因为非常量指针参数暗示函数可能修改数据,而 const 对象不允许被修改。这不是运行时检查,是编译期类型系统在拦截风险。
-
const int x = 42;→func(&x)报错:cannot convert 'const int*' to 'int*' -
func(&x)能通过的唯一前提是参数声明为const int* - 哪怕函数内部真没改数据,只要签名没加
const,接口就失去“只读”契约
const int* 和 int* const 的实际分工场景
二者解决完全不同的问题,混用会导致编译失败或语义错乱。
-
const int* p:用于函数参数、迭代器解引用(如std::vector<int>::const_iterator</int>),强调「内容不可写」 -
int* const p:多见于类成员变量(如缓存指针、句柄),强调「指针绑定不可变」,但允许修改它指向的对象 -
const int* const p:极少手写,常见于constexpr初始化或 API 返回的只读句柄,比如const char* const msg = "error";
传入字符串字面量时,const char* 是唯一安全选择
C++ 中字符串字面量类型是 const char[N],退化为 const char*。用 char* 接收不仅编译报错,强行 const_cast 后写入更是未定义行为。
- 错误写法:
void print(char* s) { /*...*/ }; print("hello");→ 编译失败 - 正确写法:
void print(const char* s) { /*...*/ }; print("hello");→ 安全通过 - 若函数内部真要修改字符串,应先拷贝到可写内存,而非绕过
const
真正容易被忽略的点在于:const 指针不是“为了好看加的修饰”,而是类型系统里一道硬性边界——它决定你能接住哪些实参、编译器能给你哪些优化保证、以及别人调用你函数时能否放心传入常量数据。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











