const char *a与char const *a与char * const a的区别

本文详细解析了C++中const与指针结合使用的四种不同情况:constchar*a、char*consta、charconst*a及constchar*consta的区别,并解释了底层const与顶层const的概念。

内容会持续更新,有错误的地方欢迎指正,谢谢!

题目

说出以下四个语句的区别:
const char *a
char * const a
char const *a
const char * const a

const和指针的基础知识:

指向常量的指针(C++Primer上叫 指向常量的指针)(底层const):自觉不去(靠它自己也不能)改变所指对象,而该对象若不是常量对象则其值通过其他方式改变所指对象。总之,const可绑定非const。
常量指针(C++Primer上叫 常量指针)(顶层const):由于指针为常量,所以声明时必须初始化,且初始化后存放在指针中那个地址不可改变。但此地址对应的数可被改变:指针常量若所指对象是常量,指针常量不能修改其所指对象的值;指针常量若所指对象是非常量,指针常量也能通过指针修改其所指对象的值。

解答

  1. const char *a声明(*a),(*a)是const char类型的。a被一个解引用运算符修饰,故a是个普通的指针,可以修改,但是a所指向的数据(即*a)由于const的修饰而不可通过指针a去修改。

  2. char *const a声明(*const a),(*const a)是char类型的。a被一个解引用运算符和一个const关键词修饰,故a是个不可修改的指针,但可通过指针a去修改a所指向的数据(即*a)。

  3. char const *a和const char *a是同一个意思。

  4. 如果既不允许a被修改,也不允许a所指向的数据被修改,那么需要声明为const char * const a。

你的代码 `char* a = "mao"; const char **tmp = *a;` 存在 **类型不匹配****逻辑错误**,以下是详细解析和修正方法: --- ### **1. 问题分析** #### **(1) `char* a = "mao"` 的问题** - **C++ 中**:字符串字面量(如 `"mao"`)的类型是 `const char[N]`,直接赋值给 `char*` **已弃用**(C++11 起会报错)。 - **修正**:应使用 `const char*`: ```cpp const char* a = "mao"; // 正确(推荐) ``` - **C 中**:虽然允许 `char* a = "mao";`,但修改 `a` 的内容(如 `a[0] = 'x';`)是 **未定义行为**(字符串字面量不可修改)。 #### **(2) `const char **tmp = *a` 的问题** - `*a` 是 `char` 类型(即字符 `'m'`),而 `tmp` 是 `const char**`(二级指针),**类型完全不匹配**。 - 若目的是让 `tmp` 指向 `a` 的地址,应使用 `&a`: ```c const char** tmp = &a; // 正确:tmp 指向 a(一级指针)的地址 ``` --- ### **2. 正确写法示例** #### **场景 1:直接使用一级指针** ```c const char* a = "mao"; // a 指向字符串 const char** tmp = &a; // tmp 指向 a 的地址 printf("%s\n", *tmp); // 输出 "mao"(通过二级指针解引用) ``` #### **场景 2:动态字符串数组(模拟 `argv`)** ```c const char* arr[] = {"mao", "zhe", "hello"}; // 字符串数组 const char** tmp = arr; // tmp 指向数组首元素 printf("%s\n", tmp[1]); // 输出 "zhe" ``` --- ### **3. 关键概念** | 表达式 | 类型 | 含义 | |--------------|---------------|-----------------------------| | `"mao"` | `const char[4]` | 字符串字面量(不可修改) | | `a` | `const char*` | 一级指针,指向字符串首字符 | | `&a` | `const char**` | 二级指针,指向 `a` 的地址 | | `*a` | `const char` | 字符 `'m'`(解引用一级指针) | | `*tmp` | `const char*` | 解引用二级指针得到 `a` 的值 | --- ### **4. 常见误区** - **错误 1**:混淆指针层级 ```c const char** tmp = "mao"; // 错误!"mao" 是 `const char*`,不是 `const char**` ``` - **错误 2**:尝试修改字符串字面量 ```c char* a = "mao"; a[0] = 'x'; // 未定义行为(崩溃或静默失败) ``` --- ### **5. 为什么需要二级指针** - **修改外部指针**: ```c void change_ptr(const char** ptr) { *ptr = "new"; } const char* a = "mao"; change_ptr(&a); // a 现在指向 "new" ``` - **处理字符串数组**:如 `main(int argc, char** argv)`。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值