cpp关于const和指针有问,路过的帮个忙看看吧

googlemi 2013-03-18 11:40:44
........................
.........................
........................
①double rates[5]={88.99,100,19,18,17};
②const double locked[4]={0.8,0.7,0.6,0.5};
③const double * pc=rates; //合法
④pc=locked; //合法
..........................
..........................
..........................
③说明指针指向数据不可更改(即*pc),但是所指向的地址是可更改的(即pc),执行后*pc=rates[0]=88.99,pc=&rates[0],
④明显合法,但是执行后pc=&locked[0],也就是说现在&locked[0]中内容为88.99,也就是说*pc=*(&locked[0])=locked[0]=88.99,但是②却声明locked[0]=0.8为const

。。。。。。。。。。。。。
。。。。。。。。。。。。。。
问题是:声明为const型的locked数组,数值为什么可以变化

...全文
209 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
googlemi 2013-03-18
  • 打赏
  • 举报
回复
引用 9 楼 falcomavin 的回复:
引用 5 楼 googlemi 的回复:引用 1 楼 falcomavin 的回复: 谁说第4步执行后&locked[0]中内容不为88.99了?明明还是为0.8 为嘛,求解释,还有你的意思是我的这句*pc=*(&locked[0])=locked[0]=88.99错啦,同求解释 *pc=*(&locked[0])……
程序中没有这一句,我是说可以这么理解不?这只是我的逻辑分析过程
googlemi 2013-03-18
  • 打赏
  • 举报
回复
引用 8 楼 falcomavin 的回复:
引用 7 楼 googlemi 的回复:引用 2 楼 lin5161678 的回复: 你自己 printf 一下看看locked[0]的值 rates[0]的值 p的值 *p的值 额,codeblocks的结果让我大吃一惊, 竟然是*pc变啦,locked[0]没变,求解释 lockd的值是不会变的,因为你是用的const数组 pc = lockd这一句让p……
问题是*pc为什么会变, ③const double * pc=rates;不是只声明p的值可变,而声明*pc为const常量吗,
黑娃 2013-03-18
  • 打赏
  • 举报
回复
引用 5 楼 googlemi 的回复:
引用 1 楼 falcomavin 的回复: 谁说第4步执行后&locked[0]中内容不为88.99了?明明还是为0.8 为嘛,求解释,还有你的意思是我的这句*pc=*(&locked[0])=locked[0]=88.99错啦,同求解释
*pc=*(&locked[0])=locked[0]=88.99这句是不能通过编译的,locked[0]=88.99就错了
黑娃 2013-03-18
  • 打赏
  • 举报
回复
引用 7 楼 googlemi 的回复:
引用 2 楼 lin5161678 的回复: 你自己 printf 一下看看locked[0]的值 rates[0]的值 p的值 *p的值 额,codeblocks的结果让我大吃一惊, 竟然是*pc变啦,locked[0]没变,求解释
lockd的值是不会变的,因为你是用的const数组 pc = lockd这一句让pc指向了lockd首地址,因为pc和lockd都是const,所以成立 接下来你就开始打印,*pc的值和lockd[0]都是6,很正常啊,你怎么会认为它们的值不一样了
googlemi 2013-03-18
  • 打赏
  • 举报
回复
引用 2 楼 lin5161678 的回复:
你自己 printf 一下看看locked[0]的值 rates[0]的值 p的值 *p的值

额,codeblocks的结果让我大吃一惊,
竟然是*pc变啦,locked[0]没变,求解释
googlemi 2013-03-18
  • 打赏
  • 举报
回复
引用 4 楼 cfjtaishan 的回复:
加上const修饰后的变量,是告诉编译器该变量不可以被修改,但并不表示该变量像常量那样不可以被修改。他可以被其他指向该区域的变量修改。
什么意思,你是说locked[0]确实变啦,拿还要const干嘛
googlemi 2013-03-18
  • 打赏
  • 举报
回复
引用 1 楼 falcomavin 的回复:
谁说第4步执行后&locked[0]中内容不为88.99了?明明还是为0.8
为嘛,求解释,还有你的意思是我的这句*pc=*(&locked[0])=locked[0]=88.99错啦,同求解释
自信男孩 2013-03-18
  • 打赏
  • 举报
回复
加上const修饰后的变量,是告诉编译器该变量不可以被修改,但并不表示该变量像常量那样不可以被修改。他可以被其他指向该区域的变量修改。
lin5161678 2013-03-18
  • 打赏
  • 举报
回复
还有2个 locked的值 rates的值
lin5161678 2013-03-18
  • 打赏
  • 举报
回复
你自己 printf 一下看看locked[0]的值 rates[0]的值 p的值 *p的值
黑娃 2013-03-18
  • 打赏
  • 举报
回复
谁说第4步执行后&locked[0]中内容不为88.99了?明明还是为0.8
googlemi 2013-03-18
  • 打赏
  • 举报
回复
引用 14 楼 falcomavin 的回复:
引用 13 楼 googlemi 的回复:引用 12 楼 falcomavin 的回复: 引用 10 楼 googlemi 的回复:引用 8 楼 falcomavin 的回复: 引用 7 楼 googlemi 的回复:引用 2 楼 lin5161678 的回复: 你自己 printf 一下看看locked[0]的值 rates[0]的值 p的值 *p的值 额,co……
额,主要我太菜啦,很多不懂,其实我很少专牛尖尖
黑娃 2013-03-18
  • 打赏
  • 举报
回复
引用 13 楼 googlemi 的回复:
引用 12 楼 falcomavin 的回复: 引用 10 楼 googlemi 的回复:引用 8 楼 falcomavin 的回复: 引用 7 楼 googlemi 的回复:引用 2 楼 lin5161678 的回复: 你自己 printf 一下看看locked[0]的值 rates[0]的值 p的值 *p的值 额,codeblocks的结果让我大吃一惊, 竟然是*pc变啦,locke……
你真是专到牛尖尖里面去了。*pc对于内存来说是没有改变的,只是pc变了,所以看见的*pc的值不同,就好比内存中两个变量a和b,pc先指着a,后指着b,你说*pc变了,但是a和b没变,内存值没变,这就是因为用了const限制a、b不能被赋值。
googlemi 2013-03-18
  • 打赏
  • 举报
回复
引用 12 楼 falcomavin 的回复:
引用 10 楼 googlemi 的回复:引用 8 楼 falcomavin 的回复: 引用 7 楼 googlemi 的回复:引用 2 楼 lin5161678 的回复: 你自己 printf 一下看看locked[0]的值 rates[0]的值 p的值 *p的值 额,codeblocks的结果让我大吃一惊, 竟然是*pc变啦,locked[0]没变,求解释 ……
你说的我倒理解啦,可是按这么推理: *pc这个不可被修改的const常量因为pc改变而被修改啦,那要不要const还有区别吗
黑娃 2013-03-18
  • 打赏
  • 举报
回复
引用 10 楼 googlemi 的回复:
引用 8 楼 falcomavin 的回复: 引用 7 楼 googlemi 的回复:引用 2 楼 lin5161678 的回复: 你自己 printf 一下看看locked[0]的值 rates[0]的值 p的值 *p的值 额,codeblocks的结果让我大吃一惊, 竟然是*pc变啦,locked[0]没变,求解释 lockd的值是不会变的,因为你是用的const数组 pc =……
原来你是这点理解有误 const double * pc=rates,这个声明告诉你,你不能出现*pc=XXX这样的操作,但是你可以改变pc的值嘛,pc值变了,*pc当然也变了啊(地址都不一样了)。你咬明白,pc它终究是以一个指针,不是常量,它有改变指针所指向地址的自由权,它只是没有改变所指向地址的值得权利。

69,377

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧