区分const char* p,char* const p

本文详细介绍了C++中指针与const限定符的使用方法,包括如何使用const限定符来保护指针指向的数据不被修改,以及如何限定指针本身不被修改。同时还解释了数组名作为指针时的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们从常规的指针开始,

char* p = new char[5]; //在内存中申请5个字节的空间,并将空间地址赋给指针变量p

指针变量p可以保存一个内存地址值,还可以去操作这个内存地址对应位置的内容,使用解引用操作符*,用*p表示。由此可见,通过指针变量p,就可以对内存进行读写操作。有时候,我们只需要读取某个内存的内容,而不需要去改变它,这样我们可以通过const修饰符去限定,以免造成不必要的错误。

const char* p = "Hello";  //等同于char const *p = "Hello";

上面这种写法,const修饰char,表示指针变量p所指向的内存中的内容不能被修改,但是指针变量p可以被修改。也就是说,*p是不可改变的,但是p是可以改变的,

p[0] = 'N';  //编译失败,提示p[0]为不可以修改的内存块
char ch[] = "china";
p = ch;  //成功,p是一个指针变量,可以被赋与另一个指针变量

既然p是一个指针变量,那么它肯定也能被const限定,从而不能被改变,

char* const p = "Hello";

与前面的限定不一样,这次const修饰p,也就是指针变量,说明p不可改变,但是char没有const修饰,因此*p是可以被改变的,

p[0] = 'Y';  //成功,p[0]指向的内存块没有const修饰,可以被修改
char ch[] = "china";
p = ch;  //失败,p是一个const指针变量,不可以被修改

当然,也可以将上面的两种情况合在一起,const char* const p;,这样*p和p都不能被改变。

一般来讲,数组名相当于一个指针变量,可以用操作指针的方法来操作数组名。同时,数组名是一个const指针变量,不能被修改
char ch[] = "china";
char* p = "love";
ch = p; //失败,ch不可改变,但是*ch可变
所以,char ch[]中的ch与char* const p中的p性质一致。const char ch[]中的ch与const char* const p中的p性质一致。

<think>好的,我现在需要帮用户区分const char *p、char const *p和char * const p这三个指针声明。首先,我得回忆一下C/C++中const关键字的位置对指针的影响。 用户可能对这三个形式容易混淆,特别是前两个const char *p和char const *p,看起来是不是一样的?我记得const在左边和右边可能会有不同的含义,但具体怎么区分呢? 首先,const char *p:这里的const修饰的是char,也就是说指针指向的字符是常量,不能通过p来修改这个字符的值。但p本身可以指向别的地址。比如,p一开始指向"hello",之后可以改成指向"world",但不能用*p = 'H'这样修改内容。 然后是char const *p,这其实和const char *p是一样的,因为const在类型说明符char的前后位置不影响,都是修饰char,所以这两个声明是等价的。也就是说,指针指向的内容是常量,指针本身可以改变指向。 接下来是char* const p,这里的const修饰的是指针p本身,所以p的指向不能改变,必须在初始化时确定,之后不能再指向其他地址。但是,指向的内容如果是非const的,可以通过p来修改。比如,char str[] = "hello"; char* const p = str; 那么p++会报错,但*p = 'H'是允许的。 可能需要用例子来帮助用户理解。例如,对于const char *p,可以举出尝试修改内容会导致编译错误,而改变指针指向是允许的。而对于char* const p,则相反,修改指向会出错,但修改内容(如果指向的是非常量)是允许的。 还要注意,当const出现在*左边时,修饰的是指向的内容;出现在*右边时,修饰的是指针本身。所以char const *p和const char *p都是内容不可变,而char* const p是指针不可变。 用户可能在实际编程中遇到这些情况,比如函数参数中传递指针时,使用不同的const修饰可以保护数据不被意外修改,或者固定指针的指向。需要强调正确使用这些声明可以提高代码的安全性和可读性。 最后,总结这三个声明的区别,确保用户能够明确区分它们的const作用对象,避免混淆。可能还需要提醒用户注意声明中的const位置,以及如何正确阅读这些声明(从右向左读,比如char* const p读作p是一个常量指针,指向char类型)。</think>在C/C++中,`const char *p`、`char const *p`和`char* const p`的区别在于`const`修饰的对象不同。以下是逐步分析: --- ### 1. **`const char *p` 或 `char const *p`** - **本质**:两者完全等价,`const`修饰的是字符内容,表示指针指向的内容不可修改。 - **特点**: - 指针可以指向其他地址(指针可变)。 - 不能通过指针修改指向的内容(内容不可变)。 - **示例**: ```c const char *p = "hello"; p = "world"; // 合法:指针可以指向新地址 *p = 'H'; // 非法:内容不可修改(编译错误) ``` --- ### 2. **`char* const p`** - **本质**:`const`修饰的是指针本身,表示指针的指向不可修改。 - **特点**: - 指针一旦初始化后不能指向其他地址(指针不可变)。 - 可以通过指针修改指向的内容(内容可变,前提是内容本身非`const`)。 - **示例**: ```c char str[] = "hello"; char* const p = str; *p = 'H'; // 合法:内容可以修改 p = "world"; // 非法:指针不可指向新地址(编译错误) ``` --- ### 3. **总结表格** | 声明形式 | 指针可变性 | 内容可变性 | 典型用途 | |------------------|------------|--------------------|------------------------------| | `const char *p` | ✔️ 可变 | ❌ 不可变 | 保护字符串常量,避免误修改 | | `char const *p` | ✔️ 可变 | ❌ 不可变 | 同上 | | `char* const p` | ❌ 不可变 | ✔️ 可变(若内容非`const`) | 固定指针指向,允许修改内容 | --- ### 4. **组合用法:完全不可变** 若同时限制指针和内容不可变: ```c const char* const p = "hello"; // 指针和内容均不可变 ``` --- ### 5. **记忆技巧** - **`const`在`*`左侧**:修饰内容不可变(如`const char *p`)。 - **`const`在`*`右侧**:修饰指针不可变(如`char* const p`)。 - **口诀**:“左定值,右定向”(左`const`定值,右`const`定指针方向)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值