关于指向CONST的指针

书中的说法应该是任何企图通过指针cptr修改其值的行为是不允许的。cptr一经定义,就不允许通过cptr修改其指对象的值了。

const指针和指向const的指针(const指针数据类型转换)const指针和指向const的指针(const指针数据类型转换)


const指针和指向const的指针(const指针数据类型转换)


const指针和指向const的指针(const指针数据类型转换)


但是c++中又允许将指向const对象的指针(cptr)指向一个非const对象。就像你上面使用的:

pb=&b。

那么在后面就不能使用pb = 111;这样的赋值语句来修改b的值了。

同样还有一句话:如果指向const对象的指针所指对象非const,则可以直接给该对象赋值来修改其值。即如你程序中的b=234修改b的值一样。

所以:不能保证指向const对象的指针所指的值一定不可以修改。

修改后,cptr输出修改后的值。

指向const对象的指针就是一个指针,不能通过它来修改它所指向的对象的值

所以你没有通过pb修改b的值就没有问题

const指针就是一个指针,它本身就是const类型,所以将它初始化后不能再改变它的指向,即不能让它指向一个新的对象

声明方法:

int const p;//指向非const对象的const指针

const int const p;//指向const对象的const指针

C++中的const指针与C语言中的const指针

这是潜在强制问题。当一个实参赋给函数形参时,实际上有一个强制类型转换过程,即要把实参的类型“临时转换”为形参类型(当然是允许转换的,不然会报错)。这里函数scanf(“%d”,p);中p位置的变量是“变量的指针”,所以临时被自动把p转换为指向变量的指针了,当然也要为其指向的目标“临时开辟”一个存储的地方。根据这个规则,不要说是scanf(“%d”,p);,就是写成scanf(“%d”,&a);也是可行的,因为这时a被临时“非常量”了。如果后面用一句printf("%d %dn",p,a);输出,当输入100时,会惊异地得到100 5的结果!

c++ const 和指针问题

这个问题请站在编译器的角度去理解。

编译器的一项任务就是"语法分析”, 而语法规定【const 变量是不许可被修改的】,编译器一直贯彻这一点。

const T a = 123; // 你声明一个T类型的const变量

编译器:嗯嗯, 名字合法, 类型合法, 初始化合法, 给你通过!

a = 234; // 你想给a赋值。

编译器:赋值? 想得美! const 变量不让赋值!

int p = &a; // 你改了下, 用一个指针指向a

编译器: 哼。 你想偷偷的用指针去改a的值, 对不对!对不对!不行不行!!

const int cp = &a; // 好吧, 那么我改成const int 总行了吧.

编译器:const 指针就勉强算你过了。【const 无权修改其指向的变量】

int pp = &cp; // 你要曲线救国。

编译器:雕虫小技!我已经看穿了。 不行!

const int cpp = &cp;

编译器:安全!

因为解引用非const指针可以修改目标值, 而const指针无权修改。

所以对于const变量来说, 为了贯彻其"不变“的原则, 其地址是无法被非const指针接收的。 只有const指针例外。

ps. 以上const指针是指 ”指向const对象的指针" 的缩写。

你看到这个书本很,如果你贴出来的都是原文,那么这写得非常晦涩难懂像一个糟糕透顶的绕口令。我尝试理解一下。

1.可以理解为const指针定义时必须被初始化指向一个具体的变量,这个变量可以是非const的变量或者指针,因为const指针定义之后不能修改。

2.意思是如果要指向的变量直接赋值给const指针,如果这个变量自身不是指针,这个变量可以是常量(本身就是地址)也可以是变量地址(&); 第二部分和变量地址的意思一样。

3.说的和2的意思一样,只不过不包含了常量。

总而言之一句话,就是const指针不能指向非const指针指向的东西(这纯粹就是一句没用的废话,因为C++是没有这个规则的,如果有错误编译器会帮你检查出来定义的不妥)。

不知道你看的是什么狗屁教材,有多远就扔多远,这本书看完了,在它的诱导下,你的C++必定完蛋。

关于C++的const语法

你是知道常量定义么几个例子:const int a=1;const char a='a';const bool a=true;...这是我面前知道的C++常量定义,不好意思,刚学,只知道这些

const是用来定义常量的,对于普通的变量是比较好理解的,但在指针方面及类定义中要小心使用。

const是只读修饰符,定义了变量的只读属性!

什么是指向const类型的指针?

1.指向const对象的指针

const int p;

这个p是一个指向int类型const对象的指针,const限定了指针p所指向的类型,而并非p本身。也就是说p本身并不是const。在定义时不需要对它进行初始化,还可以给p重新赋值,使其指向另一个const对象。但不能通过p修改所指向对象的值。

示例1:int a=0; p=&a; 可以。

示例2:p=20; 不可以。

结论:这种指向const对象的指针只是限制不能修改p指向对象的数值,而不是限制p指向什么对象。

把一个const对象的地址赋给一个不是指向const对象的指针也是不行的。

示例3:const int b=10;

int p2=&b; //error

const int p3=&b; //ok

结论:因为变量b有const修饰,不能被修改。但指针p2是一个普通的指针,可以修改指向对象的值,两种声明矛盾,所以不合法。而指向const对象的指针不允许修改指针指向对象的数值,所以这种方式合法。

2.const指针

int c=20;

int const p4=&c;

指针p4称为const指针。它和指向const对象的指针恰好相反,它不能够修改所指向对象,但却能够修改指向对象的数值。另外,这种指针在声明时必须初始化。

3.指向const对象的const指针

const int d=30;

const int const dp=&d;

指针dp既不能修改指向的对象,也不能修改只想对象的值。

就是指针指向的是一个常量,不能通过指针对其修改,如char const 指针名

非const指针可以指向const对象么?

指向const对象的指针和const指针是两个名字很接近的概念,对于初学者来说非常容易搞混,这里对它们进行区分。 指向const对象的指针 可以这样理解指向const对象的指针: 指向const对象的指针就是一个指针,不能通过它来修改它所指向的对象的值 · 声明方法:const int p; const对象在初始化后是不允许对其值进行修改的,因此,我们不能用一个普通指针指向一个const对象,即下面的赋值会引起编译错误: const int i = 1; int p = &i; 否则的话,我们就可以利用普通指针来修改一个const对象的值,那么const也就毫无意义了。 正确的方法是利用一个指向const对象的指针来获取const对象的地址: const int i = 1; const int p = &i; 这样,利用指向const对象的指针也是不能修改它所指向的const对象的值的。 需要注意的两点: 指向const对象的指针本身不是const类型(这也是它与const指针的主要不同点),所以它可以指向另一个const对象 指向const对象的指针可以被赋予一个非const对象的地址,但是此时试图通过此指针来修改对象的值的作是非法的 2. const指针 可以这样理解const指针: const指针就是一个指针,它本身就是const类型,所以将它初始化后不能再改变它的指向,即不能让它指向一个新的对象 声明方法: int const p;//指向非const对象的const指针 const int constp;//指向const对象的const指针 由以上声明方法可以看出,const指针可以指向const对象和非const对象,但是两者的声明方法是不同的。 使用const指针不可以修改其地址值,但是const指针指向非const对象,就可以利用它修改它所指向的对象的值。 总结: 初学者之所以会混淆两者的根本原因是他们头脑中的一些隐式定在作怪,也就是说想当然地给要分析的对象强加上一些它们原本并不存在的属性,这是很多人在处理问题时很容易犯的一个通病。只要语法规则没有明确说明是非法的,我们就可以拿来用,而没有必要人为地加上种种限制。其实要弄清两者的区别,只要明确两点就够了: 指针本身是const型还是非const型 指针所指向的对象是const型还是非const型 const型变量的值在初始化后是不允许改变的(这是根本),那么const指针其指向是不能变的,const对象其值是不能变的,一切都清楚了 2.要弄清楚上面的两个问题,有一个很简单的办法: 如果指针名前紧邻的关键字为const,那么它就是一个const指针;如果声明指针所指向的对象类型前有const关键字,那么它就是一个指向cosnt对象的指针。(王朝网络 打字不易,如满意,望采纳。

不能使用普通指针指向const对象,编译时会报错。

如果可行的话,我们就能通过普通指针来修改const对象的值。显然,这是错误的。