const修饰的指针和const的用法会额外的占内存吗?

43被浏览8,100分享邀请回答const int a = 3;
// const.c:6:2: error: assignment of read-only variable ‘a’
这种情况不用多说,编译错。2、使用指针赋值,提到的方法,在gcc中的warning,g++中出现error,是因为代码写得不对,由非const的变成const不用显式的转换,const变为非const需要显式转换,这种情况应当使用显式的类型转换。const int a = 3;
int* b = (int*) &a;
printf("a = %d, *b = %d\n", a, *b);
printf("a = %d, *b = %d\n", a, *b);
运行结果(注:使用msvc编译的结果一致):$ gcc const.c
a = 3, *b = 3
a = 5, *b = 5
$ g++ const.cpp
a = 3, *b = 3
a = 3, *b = 5
这里使用g++编译时,a的值之所以没有改变,是因为编译时a是常量,然后被编译器编译为立即数了。因此对使用b指针修改不会更改a的值。值得注意的是,如果a被定义为全局常变量,使用指针修改会引发segment fault。在函数的原型中,我们也常用const修饰指针,表示函数的实现者在道义上不会去修改这个指针所指向的空间。例如我们熟知的strcpy函数,原型如下:char* strcpy(char* dst, const char* src);
传入的参数src类型是const char*,表示函数内部实现不会修改src所指向的空间。之所以说是道义上,是因为在内部通过上述指针强制类型转换的方式可以修改该空间的值。另外,如果我们声明了我们不会修改传入指针的所指向的空间,那么我们也不应当去修改这块空间,因为这个传入的指针可能会是一个不可写的内存,然后出现段错误。365 条评论分享收藏感谢收起3添加评论分享收藏感谢收起大家都知道如下代码中,被const限定的a是不可以被直接修改的
void main()
const int a = 3;
  在C++中const修饰的常量,不能被直接修改,但是可以通过指针进行间接修改
来看下面的例子:
运行后输出 5 3
单步执行,利用内存窗口进行查看,未修改前a为3
当利用指针间接修改a后,a在内存中显示5
原意是想通过指针修改const常量a的值,运行后发现输出的a依然是3,a的值表面上并没有被改变。
但是查看内存窗口,发现a已经被改变,这里是编译器优化导致的,遇见a时编译器直接从寄存器中读取3给a,而不从内存中读取!
为了改善这种状况,我们可以在定义a时再加一个volatile修饰,避免编译器优化:
阅读(...) 评论()const指针和指针const的关系_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
const指针和指针const的关系
你可能喜欢

我要回帖

更多关于 c const 指针 的文章

 

随机推荐