A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

const变量可以通过指针修改的情况

C:\Users\Administrator\Desktop\Snip20160919_3
C:\Users\Administrator\Desktop\Snip20160919_2

•        num和p的地址相同,通过*p其实已经修改了该地址中保存的值,但是为什么num的值仍是100呢?
•        因为num是const变量,编译器对num在预处理的时候就进行了替换。编译器只对const变量的值读取一次。所以打印的是100。num实际存储的值发生了改变。但是为什么能改变呢,从其存储地址可以看出来,其存储在栈中。
const变量不可以通过指针修改的情况
指示num存储的空间访问冲突,不可以写,也就是没有写权限,不能修改其值。估计是存储在全局空间,且只有可读属性

三、总结:
1.        总结,const全局变量存储在全局存储空间,其值只有可读属性,不能修改;
2.        const局部变量存储在堆栈中,可通过指针修改其值;
3.        const变量在预处理时处理,编译器只对其值读取一次。
•        这其实都是因为编译器优化导致的
因为num 和p都指向相同的内存地址,所以输出的前两个结果是相同的,但为啥相同的内存里的结果不相同么?--这就是常量折叠.
这个”常量折叠“是 就是在编译器进行语法分析的时候,将常量表达式计算求值,并用求得的值来替换表达式,放入常量表。可以算作一种编译优化。
因为编译器在优化的过程中,会把碰见的const全部以内容替换掉(跟宏似的: #define pi 3.1415,用到pi时就用3.1415代替),这个出现在预编译阶段;但是在运行阶段,它的内存里存的东西确实改变了!!!
简单的说就是,当编译器处理const的时候,编译器会将其变成一个立即数。
付参考代码,
#include <stdio.h>


int main(int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, World!\n");
    int const num = 100;
    int *p = &num;
    printf("%d    %d", num, *p);
    printf("%p    %p", &num, p);
   
    *p = 200;
   
    printf("%d    %d", num, *p);
    printf("%p    %p", &num, p);

        return 0;

}


2 个回复

倒序浏览
附上程序截图

Snip20160919_2.png (42.24 KB, 下载次数: 37)

Snip20160919_2.png
回复 使用道具 举报
供参考。。。。。。。。

Snip20160919_3.png (31.75 KB, 下载次数: 61)

Snip20160919_3.png
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马