【c/c++笔试题一】const变量通过指针修改问题
2014-03-18 14:12
369 查看
转载地址: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);
}
程序编译通过,但运行时错误:
指示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);
}
程序能正常运行,且常量被修改了,但是有一个问题:
为什么 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);
}
变量a和b的地址相近。
总结,const全局变量存储在全局存储空间,其值只有可读属性,不能修改;
const局部变量存储在堆栈中,可通过指针修改其值;
const变量在预处理是处理,编译器只对其值读取一次。
const的变量在特定情况下可以通过指针修改,但是在另一些情况下是不能通过指针修改。
以下是VC6下才测试。
1 不能修改的情况
#include <stdio.h>
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);
}
程序能正常运行,且常量被修改了,但是有一个问题:
为什么 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);
}
变量a和b的地址相近。
总结,const全局变量存储在全局存储空间,其值只有可读属性,不能修改;
const局部变量存储在堆栈中,可通过指针修改其值;
const变量在预处理是处理,编译器只对其值读取一次。
相关文章推荐
- 程序笔试题-const变量通过指针修改问题
- 分享:程序笔试题-const变量通过指针修改问题
- 程序笔试题-const变量通过指针修改问题
- (转)const变量通过指针修改问题
- const变量通过指针修改问题
- const变量通过指针修改 详解
- WM_COPYATA 与 PostMessage/SendMessage;const 的变量通过指针修改后?;指针与数组名
- WM_COPYATA 与 PostMessage/SendMessage;const 的变量通过指针修改后?;指针与数组名。
- C++中通过指针修改类内私有成员变量 & 类的大小
- C++中如何修改const变量 (指针)
- C语言定义了一个结构体怎么分配内存?C\C++中结构体变量与结构体指针内存分配问题?
- c++中const变量真的不可以修改吗?
- [C++] C++中const修饰指针,变量, 函数参数和函数返回值的用法总结
- 针对上一篇指针问题详细说明(c++向函数传递指针并修改其指向的问题)
- const修饰的常量 不能被直接修改 但是可以通过指针进行间接修改
- c/c++笔试题——const类型的成员函数内部如何改变成员变量
- C++中返回临时变量指针问题
- 指针修改变量的值,以及指针交换两个数字的值的问题
- 【C++】关于带const的指针问题
- c++中const基本用法(常变量、常指针、常对象)