const限定符修饰变量时,到底怎么区分啊,求助!

2019-12-27 19:02发布

关于const修饰的具体对象,倒是很好记忆:
QQ图片20170522114139.png (91.13 KB, 下载次数: 0) 下载附件 2017-5-22 11:42 上传
只是我不理解“指针指向的对象不可变”,如下代码:
  1.       
  2.          int a=2;
  3.         const int *b=&a;//b 类型为 const int *,表示不能改变 *b 的值
  4.         //(*b)++;   编译报错
  5.         b++;//可以改变b的值,指向一个未定义的内存单元
  6.         a++;//a 类型 为 int,可以改变a的值
复制代码

a++和(*b)++不都是改变a的值吗?为何a++就可以,而(*b)++就不可以呢?
望编程老手解答一下。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
eagle_avr
1楼-- · 2019-12-27 19:20
按照我的理解,a++也是错的!
gsq19920418
2楼-- · 2019-12-27 23:30
 精彩回答 2  元偷偷看……
WM_CH
3楼-- · 2019-12-28 03:48
本帖最后由 WM_CH 于 2017-5-22 13:36 编辑

a不是const类型,当然可以改变
然而常量指针绝对不能修改指针指向的常量内容*b

一般用作函数形参,
main()
{
        int a =0;
        fun(&a);
}

fun(const int* p){
        限制这里,不能修改主函数中a的值。
}
laoshuhunya
4楼-- · 2019-12-28 09:36
楼主被误导了,楼下请继续
                                                
end2000
5楼-- · 2019-12-28 09:52
https://cdecl.org/

可以用这个网站帮助理解C复杂的声明,需要懂点点英语。

const int * const pt;
declare pt as const pointer to const int;
javenreal
6楼-- · 2019-12-28 12:27
“a++和(*b)++不都是改变a的值吗?为何a++就可以,而(*b)++就不可以呢?”

因为const并不是强制性的,const的作用仅仅是在编译器间报错,你把一个const指针强制转换为普通指针,照样可以改掉其指向的对象。

编译期间报错,可以帮助你设计架构、代码逻辑。

比如一个函数传入一个指针,你希望这个函数仅仅读取指针所指对象的值,而不希望函数去改变对象,就可以加const。  这样万一函数内部某处误去修改了,编译时就会报错。  但是如果刻意去修改,还是可以修改的。

一周热门 更多>