【c/c++笔试题一】const变量通过指针修改问题
来源:互联网 发布:知乎匿名提问没人回答 编辑:程序博客网 时间:2024/06/16 13:25
转载地址:http://blog.chinaunix.net/uid-26853826-id-3365403.html
const的变量在特定情况下可以通过指针修改,但是在另一些情况下是不能通过指针修改。
以下是VC6下才测试。
1 不能修改的情况
#include <stdio.h>
int const a = 10;
void main(void)
{
int *p = (int*)&a;
*p = 20;
printf("%d\n", *p);
}
int const a = 10;
void main(void)
{
int *p = (int*)&a;
*p = 20;
printf("%d\n", *p);
}
程序编译通过,但运行时错误:
指示a存储的空间不可以写,也就是没有写权限,不能修改其值。估计是存储在全局空间,且只有可读属性。
2 能修改的情况
#include <stdio.h>
void main(void)
{
int const a = 10;
int *p = (int*)&a;
*p = 20;
printf("&a=%d\n", &a);
printf(" p=%d\n", p);
printf(" a=%d\n", a);
printf("*p=%d\n", *p);
}
void main(void)
{
int const a = 10;
int *p = (int*)&a;
*p = 20;
printf("&a=%d\n", &a);
printf(" p=%d\n", p);
printf(" a=%d\n", a);
printf("*p=%d\n", *p);
}
程序能正常运行,且常量被修改了,但是有一个问题:
为什么 printf(" a=%d\n", a);
打印a=10?
难道一个地址空间可以存储不同的俩个值,当然不能,哈哈,这是因为a是const变量,编译器对a在预处理的时候就进行了替换。编译器只对const变量的值读取一次。所以打印的是10。a实际存储的值发生了改变。但是为什么能改变呢,从其存储地址可以看出来,其存储在堆栈中。
验证如下:
#include <stdio.h>
void main(void)
{
int const a = 10;
int b = 20;
int *p = (int*)&a;
*p = 20;
printf("&a=%x\n", &a);
printf("&b=%x\n", &b);
printf(" p=%x\n", p);
printf(" a=%d\n", a);
printf("*p=%d\n", *p);
}
void main(void)
{
int const a = 10;
int b = 20;
int *p = (int*)&a;
*p = 20;
printf("&a=%x\n", &a);
printf("&b=%x\n", &b);
printf(" p=%x\n", p);
printf(" a=%d\n", a);
printf("*p=%d\n", *p);
}
变量a和b的地址相近。
总结,const全局变量存储在全局存储空间,其值只有可读属性,不能修改;
const局部变量存储在堆栈中,可通过指针修改其值;
const变量在预处理是处理,编译器只对其值读取一次。
0 0
- 【c/c++笔试题一】const变量通过指针修改问题
- 程序笔试题-const变量通过指针修改问题
- 程序笔试题-const变量通过指针修改问题
- 笔试题——通过指针修改const变量
- const变量通过指针修改问题
- 【C】 通过指针修改const变量的值【两种思路,关于指针】
- 通过指针修改const变量
- const变量通过指针修改 详解
- const变量通过指针修改 详解
- C语言修改const变量
- C语言通过指针修改变量的值
- 用指针修改const变量问题
- C语言中的const与指针的同址异值现象(指针究竟能不能修改const问题)
- c的指针与复杂变量---const
- C语言中Const指针变量
- c语言中const修饰指针变量
- C/C++ const 修饰指针变量
- 修改C中const修饰的变量
- Java运算符
- Qt实现NTP时钟同步
- django+python创建第一个web项目
- jquery ajax 加载超时提示
- 第四周 项目2三角形类2
- 【c/c++笔试题一】const变量通过指针修改问题
- What does job syspolicy_purge_history do?
- 使用java自带加密算法实现文本的md5加密算法
- 吝啬的国度
- Codeforces-298b H Sail
- C#加密概述
- 题目1092:Fibonacci
- centos图形界面和文本界面登陆切换设置
- 响应单击右键后的磁盘格式化都要处理哪些IRP呢?