请解释 C++ 中 char*、const char*、char* const、const char* const 四种指针声明的含义和区别?
考察说明
考查对 C++ 指针语法和 const 限定符结合时的理解,包括常量指针和指向常量的指针的区别。
回答思路
- 【回答框架 1】char* 是指向字符的指针,指针本身可变,指向的字符内容也可变。可以指向字符数组或字符串字面量(但修改字面量是未定义行为)。
- 【回答框架 2】const char* 是指向 const 字符的指针,即指向的字符内容不可通过该指针修改,但指针本身可以指向其他地址。常用于表示只读字符串,例如字符串字面量。
- 【回答框架 3】char* const 是常量指针,即指针本身不可变,必须在定义时初始化,之后不能指向其他地址,但指向的字符内容可以通过该指针修改。
- 【回答框架 4】const char* const 是指向 const 字符的常量指针,指针本身和指向的字符内容都不可修改,必须在定义时初始化。
- 【回答框架 5】记忆方法:const 位于 * 左侧修饰的是指向的内容,位于 * 右侧修饰的是指针本身。
- 【关键点 1】const char* 可以指向 char*,反之不行,因为可能通过 char* 修改只读内容。
- 【关键点 2】字符串字面量通常用 const char* 指向,如 const char* str = "hello";
- 【关键点 3】顶层 const 和底层 const 的区别:顶层 const 修饰指针本身,底层 const 修饰指向的对象。
- 【易错点 1】不要试图通过 char* 修改字符串字面量,这会导致未定义行为。
- 【易错点 2】不要将 char* 隐式转换为 const char* 后认为可以修改,这是合理的转换,但修改是不允许的。
- 【易错点 3】声明时应该从右向左读,例如 const char* const 读作指向 const 字符的常量指针。