C++ const 指针,这个是什么意思

时间:2022-09-09 18:19:02
一般的的const  还好, 这个理解不了,求告诉下怎么分析最后两个表达式。希望具体点

const int * pi = &a; 
const int *const *const ppi = π 
const int  *const *const *pppi = &ppi; 

16 个解决方案

#1


const放*后面就是修饰那个*对应的指针。

#2


int a = 10;
const int * pi = &a; 
const int *const *const ppi = π 
const int  *const *const *pppi = &ppi;

pi = nullptr;  // pi不是const,可以赋值
*pi = 5;  // 错误,*pi是const int,不能赋值

ppi = nullptr;  // 错误,ppi是* const,不能赋值
*ppi = nullptr; // 错误,*ppi也是* const,不能赋值
**ppi = 5; // 错误,**ppi是const int,不嫩赋值

pppi = nullptr;  // pppi不是const,可以赋值
*pppi = nullptr; // 错误,*pppi是* const,不能赋值
**pppi = nullptr; // 错误,**pppi是* const,不嫩赋值
***pppi = 5; // 错误, ***pppi是const int,不能赋值

#3


额 尝试解答一下 自己都晕了  贴一段文字 清醒清醒 
   int const a 和 const int a  定义常量 a 
   const int *a                     定义指向常变量的指针
   int * const a                    定义指向变量的常指针
  int  const * a const           定义指向常变量的常指针 
C++ const 指针,这个是什么意思 

#4


不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!

#5


给你一个判断原则:const 与左边最后一个声明说明符之间有多少个*号,那么就是多少级指针是const的

#6


const int *const *const ppi = π从变量名开始向左分析,首先这个ppi是一个const指针,属于顶层const,然后他指向也属于顶层const的指针,这个指针指向一个int类型常量

#7


分享一个学来的技巧,遇到const变量区分的问题,记住从右往左读变量的意思就行了。
 const int *a                     
定义指向常变量的指针,先是*a为int型指针,再是const ,const修饰的是(int *a,为指针指向的内容,所以不变的是指针指向的内容)。
所以整个意思就是 指向常变量的指针

#8


第一行,是正常见到的程序。很好理解。

后面两行,你要理解的意义在哪里? 这样的代码,写出来,又有谁要去维护?

#9



const int * pi = &a; 
const int *const *const ppi = π 
const int  *const *const *pppi = &ppi; 


记住一个重点就是const离谁近谁就是const
第一个离*近没说明* 是const,也就是是指针指向的内容不可变
第二个例子,每个* 前面都有,ppi变量也有,说明指针不可变,内容不可变
第三个例子,三个* 前面有const,但是变量pppi没有const,说明最后一级指针是可以移动的

#10


这是在钻牛角尖学习C++有必要纠结这些烧脑的问题么,我觉得与其浪费精力在解决这些无用的语法问题上,不如在提高代码的可读性上多投入些精力。毕竟现代编程尤其是大型编程,更具可读性的代码其重要性已经超越了对算法的优化。

#11


引用 楼主 zwfars 的回复:
一般的的const  还好, 这个理解不了,求告诉下怎么分析最后两个表达式。希望具体点

const int * pi = &a; 
const int *const *const ppi = π 
const int  *const *const *pppi = &ppi; 

你可以看看这个通用的理解方法
http://blog.csdn.net/albertsh/article/details/64440740

#12


引用 2 楼 vnvlyp 的回复:
int a = 10;
const int * pi = &a; 
const int *const *const ppi = π 
const int  *const *const *pppi = &ppi;

pi = nullptr;  // pi不是const,可以赋值
*pi = 5;  // 错误,*pi是const int,不能赋值

ppi = nullptr;  // 错误,ppi是* const,不能赋值
*ppi = nullptr; // 错误,*ppi也是* const,不能赋值
**ppi = 5; // 错误,**ppi是const int,不嫩赋值

pppi = nullptr;  // pppi不是const,可以赋值
*pppi = nullptr; // 错误,*pppi是* const,不能赋值
**pppi = nullptr; // 错误,**pppi是* const,不嫩赋值
***pppi = 5; // 错误, ***pppi是const int,不能赋值

我给点个赞,稍微有一点不准确

int a = 10;
const int * pi = &a; 
const int *const *const ppi = π 
const int  *const *const *pppi = &ppi;

pi = nullptr;  // pi不是const,可以赋值
*pi = 5;  // 错误,*pi是const int,不能赋值

ppi = nullptr;  // 错误,ppi是const int *const *const,不能赋值 //改一下
*ppi = nullptr; // 错误,*ppi也是const int *const,不能赋值 //改一下
**ppi = 5; // 错误,**ppi是const int,不嫩赋值

pppi = nullptr;  // pppi不是const,可以赋值
*pppi = nullptr; // 错误,*pppi是const int  *const *const,不能赋值  //改一下
**pppi = nullptr; // 错误,**pppi是const int  *const,不嫩赋值   //改一下
***pppi = 5; // 错误, ***pppi是const int,不能赋值

#13


为何我有点不想解释了呢???反正楼上也解释了

#14


引用 10 楼 dragonzxb 的回复:
这是在钻牛角尖学习C++有必要纠结这些烧脑的问题么,我觉得与其浪费精力在解决这些无用的语法问题上,不如在提高代码的可读性上多投入些精力。毕竟现代编程尤其是大型编程,更具可读性的代码其重要性已经超越了对算法的优化。


const对于提高可读性也是有帮助的,怎么就是无用的无法问题?
而且实际你不会这么写并不代表你不需要知道。
另外可读性和代码优化也并不冲突,不是把代码压缩得密密麻麻,写得乱七八糟就叫优化。

#15


引用 12 楼 shihengzhen101 的回复:
我给点个赞,稍微有一点不准确

int a = 10;
const int * pi = &a; 
const int *const *const ppi = π 
const int  *const *const *pppi = &ppi;

pi = nullptr;  // pi不是const,可以赋值
*pi = 5;  // 错误,*pi是const int,不能赋值

ppi = nullptr;  // 错误,ppi是const int *const *const,不能赋值 //改一下
*ppi = nullptr; // 错误,*ppi也是const int *const,不能赋值 //改一下
**ppi = 5; // 错误,**ppi是const int,不嫩赋值

pppi = nullptr;  // pppi不是const,可以赋值
*pppi = nullptr; // 错误,*pppi是const int  *const *const,不能赋值  //改一下
**pppi = nullptr; // 错误,**pppi是const int  *const,不嫩赋值   //改一下
***pppi = 5; // 错误, ***pppi是const int,不能赋值


嗯我没把指针指向的类型写出来,感觉这样清晰一点,不然新手看到“ppi是const int *const *const”,还是不知道到底是什么。

#16


引用 15 楼 vnvlyp 的回复:
Quote: 引用 12 楼 shihengzhen101 的回复:

我给点个赞,稍微有一点不准确

int a = 10;
const int * pi = &a; 
const int *const *const ppi = π 
const int  *const *const *pppi = &ppi;

pi = nullptr;  // pi不是const,可以赋值
*pi = 5;  // 错误,*pi是const int,不能赋值

ppi = nullptr;  // 错误,ppi是const int *const *const,不能赋值 //改一下
*ppi = nullptr; // 错误,*ppi也是const int *const,不能赋值 //改一下
**ppi = 5; // 错误,**ppi是const int,不嫩赋值

pppi = nullptr;  // pppi不是const,可以赋值
*pppi = nullptr; // 错误,*pppi是const int  *const *const,不能赋值  //改一下
**pppi = nullptr; // 错误,**pppi是const int  *const,不嫩赋值   //改一下
***pppi = 5; // 错误, ***pppi是const int,不能赋值


嗯我没把指针指向的类型写出来,感觉这样清晰一点,不然新手看到“ppi是const int *const *const”,还是不知道到底是什么。

有道理 C++ const 指针,这个是什么意思

#1


const放*后面就是修饰那个*对应的指针。

#2


int a = 10;
const int * pi = &a; 
const int *const *const ppi = π 
const int  *const *const *pppi = &ppi;

pi = nullptr;  // pi不是const,可以赋值
*pi = 5;  // 错误,*pi是const int,不能赋值

ppi = nullptr;  // 错误,ppi是* const,不能赋值
*ppi = nullptr; // 错误,*ppi也是* const,不能赋值
**ppi = 5; // 错误,**ppi是const int,不嫩赋值

pppi = nullptr;  // pppi不是const,可以赋值
*pppi = nullptr; // 错误,*pppi是* const,不能赋值
**pppi = nullptr; // 错误,**pppi是* const,不嫩赋值
***pppi = 5; // 错误, ***pppi是const int,不能赋值

#3


额 尝试解答一下 自己都晕了  贴一段文字 清醒清醒 
   int const a 和 const int a  定义常量 a 
   const int *a                     定义指向常变量的指针
   int * const a                    定义指向变量的常指针
  int  const * a const           定义指向常变量的常指针 
C++ const 指针,这个是什么意思 

#4


不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!

#5


给你一个判断原则:const 与左边最后一个声明说明符之间有多少个*号,那么就是多少级指针是const的

#6


const int *const *const ppi = π从变量名开始向左分析,首先这个ppi是一个const指针,属于顶层const,然后他指向也属于顶层const的指针,这个指针指向一个int类型常量

#7


分享一个学来的技巧,遇到const变量区分的问题,记住从右往左读变量的意思就行了。
 const int *a                     
定义指向常变量的指针,先是*a为int型指针,再是const ,const修饰的是(int *a,为指针指向的内容,所以不变的是指针指向的内容)。
所以整个意思就是 指向常变量的指针

#8


第一行,是正常见到的程序。很好理解。

后面两行,你要理解的意义在哪里? 这样的代码,写出来,又有谁要去维护?

#9



const int * pi = &a; 
const int *const *const ppi = π 
const int  *const *const *pppi = &ppi; 


记住一个重点就是const离谁近谁就是const
第一个离*近没说明* 是const,也就是是指针指向的内容不可变
第二个例子,每个* 前面都有,ppi变量也有,说明指针不可变,内容不可变
第三个例子,三个* 前面有const,但是变量pppi没有const,说明最后一级指针是可以移动的

#10


这是在钻牛角尖学习C++有必要纠结这些烧脑的问题么,我觉得与其浪费精力在解决这些无用的语法问题上,不如在提高代码的可读性上多投入些精力。毕竟现代编程尤其是大型编程,更具可读性的代码其重要性已经超越了对算法的优化。

#11


引用 楼主 zwfars 的回复:
一般的的const  还好, 这个理解不了,求告诉下怎么分析最后两个表达式。希望具体点

const int * pi = &a; 
const int *const *const ppi = π 
const int  *const *const *pppi = &ppi; 

你可以看看这个通用的理解方法
http://blog.csdn.net/albertsh/article/details/64440740

#12


引用 2 楼 vnvlyp 的回复:
int a = 10;
const int * pi = &a; 
const int *const *const ppi = π 
const int  *const *const *pppi = &ppi;

pi = nullptr;  // pi不是const,可以赋值
*pi = 5;  // 错误,*pi是const int,不能赋值

ppi = nullptr;  // 错误,ppi是* const,不能赋值
*ppi = nullptr; // 错误,*ppi也是* const,不能赋值
**ppi = 5; // 错误,**ppi是const int,不嫩赋值

pppi = nullptr;  // pppi不是const,可以赋值
*pppi = nullptr; // 错误,*pppi是* const,不能赋值
**pppi = nullptr; // 错误,**pppi是* const,不嫩赋值
***pppi = 5; // 错误, ***pppi是const int,不能赋值

我给点个赞,稍微有一点不准确

int a = 10;
const int * pi = &a; 
const int *const *const ppi = π 
const int  *const *const *pppi = &ppi;

pi = nullptr;  // pi不是const,可以赋值
*pi = 5;  // 错误,*pi是const int,不能赋值

ppi = nullptr;  // 错误,ppi是const int *const *const,不能赋值 //改一下
*ppi = nullptr; // 错误,*ppi也是const int *const,不能赋值 //改一下
**ppi = 5; // 错误,**ppi是const int,不嫩赋值

pppi = nullptr;  // pppi不是const,可以赋值
*pppi = nullptr; // 错误,*pppi是const int  *const *const,不能赋值  //改一下
**pppi = nullptr; // 错误,**pppi是const int  *const,不嫩赋值   //改一下
***pppi = 5; // 错误, ***pppi是const int,不能赋值

#13


为何我有点不想解释了呢???反正楼上也解释了

#14


引用 10 楼 dragonzxb 的回复:
这是在钻牛角尖学习C++有必要纠结这些烧脑的问题么,我觉得与其浪费精力在解决这些无用的语法问题上,不如在提高代码的可读性上多投入些精力。毕竟现代编程尤其是大型编程,更具可读性的代码其重要性已经超越了对算法的优化。


const对于提高可读性也是有帮助的,怎么就是无用的无法问题?
而且实际你不会这么写并不代表你不需要知道。
另外可读性和代码优化也并不冲突,不是把代码压缩得密密麻麻,写得乱七八糟就叫优化。

#15


引用 12 楼 shihengzhen101 的回复:
我给点个赞,稍微有一点不准确

int a = 10;
const int * pi = &a; 
const int *const *const ppi = π 
const int  *const *const *pppi = &ppi;

pi = nullptr;  // pi不是const,可以赋值
*pi = 5;  // 错误,*pi是const int,不能赋值

ppi = nullptr;  // 错误,ppi是const int *const *const,不能赋值 //改一下
*ppi = nullptr; // 错误,*ppi也是const int *const,不能赋值 //改一下
**ppi = 5; // 错误,**ppi是const int,不嫩赋值

pppi = nullptr;  // pppi不是const,可以赋值
*pppi = nullptr; // 错误,*pppi是const int  *const *const,不能赋值  //改一下
**pppi = nullptr; // 错误,**pppi是const int  *const,不嫩赋值   //改一下
***pppi = 5; // 错误, ***pppi是const int,不能赋值


嗯我没把指针指向的类型写出来,感觉这样清晰一点,不然新手看到“ppi是const int *const *const”,还是不知道到底是什么。

#16


引用 15 楼 vnvlyp 的回复:
Quote: 引用 12 楼 shihengzhen101 的回复:

我给点个赞,稍微有一点不准确

int a = 10;
const int * pi = &a; 
const int *const *const ppi = π 
const int  *const *const *pppi = &ppi;

pi = nullptr;  // pi不是const,可以赋值
*pi = 5;  // 错误,*pi是const int,不能赋值

ppi = nullptr;  // 错误,ppi是const int *const *const,不能赋值 //改一下
*ppi = nullptr; // 错误,*ppi也是const int *const,不能赋值 //改一下
**ppi = 5; // 错误,**ppi是const int,不嫩赋值

pppi = nullptr;  // pppi不是const,可以赋值
*pppi = nullptr; // 错误,*pppi是const int  *const *const,不能赋值  //改一下
**pppi = nullptr; // 错误,**pppi是const int  *const,不嫩赋值   //改一下
***pppi = 5; // 错误, ***pppi是const int,不能赋值


嗯我没把指针指向的类型写出来,感觉这样清晰一点,不然新手看到“ppi是const int *const *const”,还是不知道到底是什么。

有道理 C++ const 指针,这个是什么意思