const char*p与char* const p的区别

文章详细阐述了C++中constchar*和char*const两种指针类型的差异。constchar*表示可变指针,指向不可变内容,而char*const表示不可变指针,指向可变内容。通过代码示例说明了这两种类型在赋值和修改指针内容时的不同行为。

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

const char* p

定义的是一个指向字符型的指针变量。即p是一个变量,p可以变,也就是说p指向的地址可以发生变化,但是p指向的地址的内容无法改变。

int main()
{
  char ch1[6] = {"abcde"};///(补充一下:在字符串存储中最后都会加上一个结束符'\0'。所以存储5个字符的字符串应该要有6个空间。)
  const char(* ph)=ch1;
  char ch2[4]={"bit"};
  ph=ch2;//正确
  *ph = 'c';//错误
  printf("%s",ph)//bit
  printf("%s\n", ch1);//abcde
  return 0;
}

char* const p

定义的是一个指向字符型的指针常量。即p变成了常量,p不可以变,也就是说p指向的地址不可以发生变化,但是p指向的地址的内容可以修改。

int main()
{
    char ch1[6] = { "abcde" };
	 char *const ph = ch1;
	char ch2[4] = { "bit"};
	ph = ch2;//错误
    *ph='c';//正确	
    printf("%s", ph);//cbcde
    printf("%s", ch1);//cbcde
    return 0;
}

<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`定指针方向)。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值