【C++】【const char *a && char *const a 区别】

本文探讨了constchar*a常量指针和char*consta指针常量的区别,展示了如何在C++中正确使用它们,并介绍了constchar*consta的含义。通过实例解析,揭示了指针类型修饰符对数据操作的影响。

2022-2-13

1. const char *a 常量指针

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

#include<iostream>
using namespace std;
int main()
{
	char arr[] = "abcdefg";//定义一个字符串数组,数组名相当于首元素地址
	const char* str = arr;
	arr[0] = 'q';
	arr[1] = 'w';
	printf("%s", arr);
}

运行结果:
qwcdefg

2. char *const a 指针常量

char *const a:声明( * const a),( * const a) 是 char 类型的。a 被一个解引用运算符和一个 const 关键词修饰,故 a 是个不可修改的指针,但可通过指针 a 去修改 a 所指向的数据(即*a)。
这是定义了一个指向字符的指针常量,即str的指向不能被修改,但是可以修改指针所指向的内容。

#include<iostream>
using namespace std;
int main()
{
	char arr[] = "abcdefg";//定义一个字符串数组,数组名相当于首元素地址
	char* const str = arr;
	str[0] = '3';//通过指针p间接修改arr数组的内容
	printf("%s\n", arr);
}

运行结果:
3bcdefg
#include<iostream>
using namespace std;
int main()
{
	char arr[] = "abcdefg";//定义一个字符串数组,数组名相当于首元素地址
	char* const str = arr;
	str++;//修改str的指向
	printf("%s\n", arr);
}

编译报错

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

4. const char * const a

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

<think>我们正在讨论C/C++中的指针常量修饰符。 const char * a 表示指针a指向一个常量字符,即不能通过指针a修改所指向的字符,但指针a本身可以指向其他地址。 char * const a 表示指针a本身是常量,即指针a的指向不能改变,但可以通过指针a修改所指向的字符。 下面详细解释: 1. **const char * a**: - `const`修饰的是`char`,即字符内容是常量。 - 这意味着:`a`指向的内容不能被修改(只读),但`a`本身可以重新指向另一个地址。 - 示例: ```c const char * a = "hello"; a = "world"; // 合法:改变指针指向 // a[0] = 'H'; // 非法:不能修改内容 ``` 2. **char * const a**: - `const`修饰的是指针`a`,即指针本身是常量。 - 这意味着:`a`的指向不能改变(固定指向一个地址),但可以通过`a`修改该地址上的内容(如果该内容可修改)。 - 示例: ```c char str[] = "hello"; char * const a = str; a[0] = 'H'; // 合法:修改内容 // a = "world"; // 非法:不能改变指针指向 ``` 3. **双重constconst char * const a)**: - 指针本身指向的内容都不可变。 - 示例: ```c const char * const a = "hello"; // a[0] = 'H'; // 非法:不能修改内容 // a = "world"; // 非法:不能改变指向 ``` **重要注意事项**: - 当字符串字面量赋值给`const char*`时是安全的,但赋值给非`const`的`char*`(如`char *p = "hello";`)在C++中已被弃用(因为字符串字面量是常量,存储在只读区域)。 - 在C中,字符串字面量的类型是`char[]`(但修改行为未定义),因此最好用`const char*`指向它们。 §§相关问题§§1. 如何声明一个指向不可变字符串的指针,且该指针自身也不可重新赋值?2. 在函数参数中,使用`const char *``char * const`分别有什么实际意义?3. 如果尝试修改通过`const char*`指针指向的字符串内容,编译器会如何处理?4. 在C++中,为什么推荐使用`const char*`而不是`char*`来指向字符串字面量?5. 如何理解`char const *`与`const char *`的关系? </think>在C/C++中,`const char * a``char * const a`的区别在于**常量修饰对象不同**,直接影响指针行为可修改性。以下是详细对比: ### 1. **const char * a**(常量内容) - **含义**:指向常量字符的指针 - `const`修饰`char`(内容不可变) - 指针本身可以修改(指向其他地址) - **行为**: ```c const char * a = "Hello"; a = "World"; // ✅ 合法:修改指针指向 // a[0] = 'h'; // ❌ 非法:不能修改内容(内容为常量) ``` - **典型用途**:只读字符串(如字面量) ### 2. **char * const a**(常量指针) - **含义**:指向字符的常量指针 - `const`修饰`*a`(指针本身不可变) - 内容可以修改 - **行为**: ```c char str[] = "Hello"; char * const a = str; a[0] = 'h'; // ✅ 合法:修改内容 // a = "World"; // ❌ 非法:不能修改指针指向 ``` - **典型用途**:固定地址的缓冲区(如硬件寄存器映射) ### 对比总结 | 特性 | `const char * a` | `char * const a` | |---------------------|------------------------|------------------------| | **内容是否可修改** | ❌ 不可变 | ✅ 可变 | | **指针是否可重指向**| ✅ 可变 | ❌ 不可变 | | **内存安全** | 防止意外写操作 | 防止指针意外指向其他地址 | ### 特殊组合:双重const ```c const char * const a = "Immutable"; // 指针内容均不可修改 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eternity_GQM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值