c常量指针与指针常量情况分析

本文详细解析了常量指针与指针常量的概念及应用,通过多个实例对比了两者之间的区别,并介绍了如何正确地理解和使用这些概念。

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

今天做了道指针题,问哪些定义可行,有点模糊,重新整理下,参考这个

“常量指针”所指向的地址上的数据是常量,而“指针常量”所指向的地址是常量,地址上面的数据是可以变化的

“常量指针”表述为常量的指针,它首先应该是一个指针,就是指向常量的指针,关键字 const出现在 * 左边,表示指针所指向地址的内容是不可修改的,但指针自身可变。

“指针常量”表述为指针的常量,它首先应该是一个常量,指针自身是一个常量,关键字 const出现在 * 右边,表示指针自身不可变,但其指向地址的内容是可以被修改的。(一开始初始化指向哪,就只能指向哪,不能指向其他的地方了,就像一个数组的数组名一样,是一个固定的指针,不能对它移动,)

举例说明:

 

如果 我们定义一个常量,const int a=7; 那么 我们可以定义一个常量指针来指向它,const int *p=&a, 或分成两步实现,const int *p; p=&a;

int a;   int *const p=&a;  或者 int a; int * const p;  p=&a;

1 void main(){
 2     char *str1={"Hello"};
 3     char *str2={"Hello World"};
 4     char * const ptr1 =str1 ;
 5     //指针常量--指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化
 6 
 7     ptr1 =str2; //错误 因为这是一个常量指针,改变指向的地址了
 8 
 9     printf("%s n",*ptr1);
10     }
11 
12 
13 // 编译错误    error C3892: 'ptr1' : you cannot assign to a variable that is const    
14 


第二个

 1 void main(){
 2     char *str1={"Hello"};
 3     char *str2={"Hello World"};
 4     char * const ptr1 =str1 ;
 5     //指针常量--指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化
 6 
 7     *ptr1 ='A';// 正确 因为指向的地址的内容是可以变化的
 8 
 9     printf("%c n",*ptr1);
10     }
11 
12 //输出  A
13 

第三个

 1 void main(){
 2     char *str1={"Hello"};
 3     char *str2={"Hello World"};
 4     const char *ptr1 = str1;
 5     //常量指针--指向字符串常量,所指向的字符串内容不能变,但是指向的地址可以变化
 6     
 7     ptr1=str2;// 正确 因为指向的地址是可以变化的
 8 
 9     printf("%s n",ptr1);
10     }
11 
12 //输出 Hello World

第四个

 1 void main(){
 2     char *str1={"Hello"};
 3     char *str2={"Hello World"};
 4     const char *ptr1 = str2;
 5     //常量指针--指向字符串常量,所指向的字符串内容不能变,但是指向的地址可以变化
 6     
 7     ptr1='A';// 错误 因为指向的地址是内容是不可以变化的
 8 
 9     printf("%c n",ptr1);
10     }
11 
12 
13 //编译错误    error C2440: '=' : cannot convert from 'char' to 'const char *'

 

可以这样来记忆: 
const int a;       // const常量 
const int *a; //指向常量的指针 
int *const a=&n; //常量指针 
你在纸上按顺序写下以上三行,记住它们的注释长度:短————短, 

 

          int*p;读作p为指针,指向int,所以p为指向int的指针;

         int*const p;读作p为常量,是指针,指向int,所以p为指向int的常量指针, p不可修改;

         int const *p;p为指针,指向常量,为int,所以p为指向int常量的指针, *p不可修改 ;

         int ** const p; p为常量,指向指针,指针指向int,所以p为指向int型指针的常量指针,p不可修改;

         int const**p; p为指针,指向指针,指针指向常量int,所以p为指针,指向一个指向int常量的指针, **p为int,不可修改 ;

         int * const *p ; p为指针,指向常量,该常量为指针,指向int,所以p为指针,指向一个常量指针,*p为指针,不可修改 ;

         int ** const *p; p为指针,指向常量,常量为指向指针的指针,p为指针,指向常量型指针的指针,*p为指向指针的指针,不可修改 ;

         int * const **p; p为指针,指向一个指针1,指针1指向一个常量,常量为指向int的指针,即p为指针,指向一个指向常量指针的指针, **p为指向一个int的指针,不可修改

          下面列举个例子,关于STL里面使用迭代器来模拟同样情况的话:

          std::vector<int> vec;

          const std::vector<int>::iterator iter=vec.begin();  //ietr just like a T* const

          *iter=10;   //ok,change the item pointed to

          ++iter;   //wrong,iter is const

           std::vector<int>::const_iterator cIter=vec.begin();   //iter acts like a const T*

           *cIter=10;   //wrong,*cIter is const

           ++cIter;   //OK

 

“常量指针”所指向的地址上的数据是常量,而“指针常量”所指向的地址是常量,地址上面的数据是可以变化的

“常量指针”表述为常量的指针,它首先应该是一个指针,就是指向常量的指针,关键字 const出现在 * 左边,表示指针所指向地址的内容是不可修改的,但指针自身可变。

“指针常量”表述为指针的常量,它首先应该是一个常量,指针自身是一个常量,关键字 const出现在 * 右边,表示指针自身不可变,但其指向地址的内容是可以被修改的。(一开始初始化指向哪,就只能指向哪,不能指向其他的地方了,就像一个数组的数组名一样,是一个固定的指针,不能对它移动,)

举例说明:

 

如果 我们定义一个常量,const int a=7; 那么 我们可以定义一个常量指针来指向它,const int *p=&a, 或分成两步实现,const int *p; p=&a;

int a;   int *const p=&a;  或者 int a; int * const p;  p=&a;

 

下面看几个简单的例子,可以说明他们的区别:
            第一个

1 void main(){
 2     char *str1={"Hello"};
 3     char *str2={"Hello World"};
 4     char * const ptr1 =str1 ;
 5     //指针常量--指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化
 6 
 7     ptr1 =str2; //错误 因为这是一个常量指针,改变指向的地址了
 8 
 9     printf("%s n",*ptr1);
10     }
11 
12 
13 // 编译错误    error C3892: 'ptr1' : you cannot assign to a variable that is const    
14 


第二个

 1 void main(){
 2     char *str1={"Hello"};
 3     char *str2={"Hello World"};
 4     char * const ptr1 =str1 ;
 5     //指针常量--指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化
 6 
 7     *ptr1 ='A';// 正确 因为指向的地址的内容是可以变化的
 8 
 9     printf("%c n",*ptr1);
10     }
11 
12 //输出  A
13 

第三个

 1 void main(){
 2     char *str1={"Hello"};
 3     char *str2={"Hello World"};
 4     const char *ptr1 = str1;
 5     //常量指针--指向字符串常量,所指向的字符串内容不能变,但是指向的地址可以变化
 6     
 7     ptr1=str2;// 正确 因为指向的地址是可以变化的
 8 
 9     printf("%s n",ptr1);
10     }
11 
12 //输出 Hello World

第四个

 1 void main(){
 2     char *str1={"Hello"};
 3     char *str2={"Hello World"};
 4     const char *ptr1 = str2;
 5     //常量指针--指向字符串常量,所指向的字符串内容不能变,但是指向的地址可以变化
 6     
 7     ptr1='A';// 错误 因为指向的地址是内容是不可以变化的
 8 
 9     printf("%c n",ptr1);
10     }
11 
12 
13 //编译错误    error C2440: '=' : cannot convert from 'char' to 'const char *'

 

可以这样来记忆: 
const int a;       // const常量 
const int *a; //指向常量的指针 
int *const a=&n; //常量指针 
你在纸上按顺序写下以上三行,记住它们的注释长度:短————短, 

 

<think>好的,用户想了解C++中指针常量常量指针的区别。首先,我需要回忆相关的知识点,并确保自己理解正确。根据提供的引用资料,特别是引用[1]、[2]、[4]和[5],这两个概念的区别主要在于const的位置以及所修饰的对象。 首先,指针常量(Constant Pointer)是指指针本身的地址不可变,但指向的值可以变。这里的const修饰的是指针变量,所以声明应该是int* const ptr。例如,引用[4]中提到,指针常量常量,然后是一个指针,地址不会变,如int* const c = &a;,此时c的地址不能修改,但*c的值可以改变。 然后,常量指针(Pointer to Const)是指指针指向的值是常量,不可变,但指针本身可以指向其他地址。这里的const修饰的是指向的数据类型,声明形式为const int* ptr或int const* ptr。例如,引用[2]指出,常量指针指向的是常量,所以不能通过指针修改值,但指针可以指向不同的地址。 接下来,我需要整理两者的区别,最好用例子来说明。比如指针常量不能改变指向的地址,但可以改变该地址的值;而常量指针可以改变指向的地址,但不能通过指针修改值。还要注意声明时const的位置:如果const在*右边,如int* const,是指针常量;如果const在*左边,如const int*,是常量指针。 另外,用户可能混淆这两种概念,所以需要明确区分。引用[4]提到,当const在最左边时,修饰右边最近的类型,否则修饰左边的类型。这可能帮助用户记忆。 然后,应该总结两者的语法、可变部分以及例子。可能还需要提到常量指针常量,即const int* const ptr,这种形式下指针和指向的值都不可变,如引用[3]所述。 最后,生成相关问题,帮助用户进一步巩固知识,比如如何声明这两种指针,它们的应用场景等。需要确保问题覆盖关键点,并引导用户深入理解。 检查是否有遗漏,比如是否解释了为什么const的位置不同导致不同的含义,以及可能的常见错误,比如试图修改常量指针指向的值导致编译错误。同时,确保引用的资料正确,比如引用[4]中的例子是否正确应用了概念。 现在,组织语言,用中文清晰、结构分明地解释这两个概念,使用示例代码和对比表格,最后生成相关问题。</think>### C++ 指针常量常量指针的区别 在 C++ 中,**指针常量**和**常量指针**的核心区别在于 `const` 关键字修饰的对象不同,这直接影响指针的地址或指向的值是否可变。以下是具体分析: --- #### 1. **指针常量(Constant Pointer)** - **定义**:指针本身是常量,即指针的地址不可变,但可以通过指针修改其指向的值。 - **语法**:`类型* const 指针名 = &变量;` - **特点**: - `const` 修饰指针变量(位于 `*` 右侧)。 - 指针的指向固定,但指向的值可以修改。 - **示例**: ```cpp int a = 1, b = 2; int* const ptr = &a; // ptr是常量,必须初始化 *ptr = 10; // 合法:修改a的值为10 ptr = &b; // 非法:ptr的地址不可变[^4] ``` --- #### 2. **常量指针(Pointer to Const)** - **定义**:指针指向的值是常量,即不可通过指针修改值,但指针可以指向其他地址。 - **语法**:`const 类型* 指针名 = &变量;` 或 `类型 const* 指针名 = &变量;` - **特点**: - `const` 修饰指向的数据类型(位于 `*` 左侧)。 - 指针的指向可变,但指向的值不可通过指针修改。 - **示例**: ```cpp int a = 1, b = 2; const int* ptr = &a; // ptr指向的值是常量 ptr = &b; // 合法:ptr指向b的地址 *ptr = 10; // 非法:不能通过ptr修改值[^2] ``` --- #### 3. **对比表格** | 特性 | 指针常量 (`int* const ptr`) | 常量指针 (`const int* ptr`) | |---------------------|------------------------------|------------------------------| | **指针地址是否可变** | ❌(固定) | ✅(可变) | | **指向的值是否可变** | ✅(可修改) | ❌(不可修改) | | **`const` 位置** | `*` 右侧 | `*` 左侧 | --- #### 4. **进阶:常量指针常量** - **定义**:指针的地址和指向的值均不可变。 - **语法**:`const 类型* const 指针名 = &变量;` - **示例**: ```cpp int a = 1; const int* const ptr = &a; // ptr和*ptr均不可变 *ptr = 10; // 非法 ptr = nullptr; // 非法[^3] ``` --- #### 5. **记忆技巧** - **指针常量**:先写指针(`*`),后写 `const` → **指针本身是常量**。 - **常量指针**:先写 `const`,后写指针 → **指向的值是常量**。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值