const变量探究

同样的一段代码,在c和c++中的表现却不相同。

#include <stdio.h>
#include <stdlib.h>

int main()
{
	const int i = 1;
	int *j =(int *) &i;
	*j = 0;
	printf("%d,%d\n", i,*j);
	system("pause");
}

当用c编译器编译运行时,结果是0,0

当用c++编译器编译运行时,结果是1,0

原因:c语言中const变量与普通变量存储方式相同,只是在语法上限制了其修改,我们依然可以通过指针来修改它。

c++中的const不同,在c++中,对于内置类型,const变量有两项动作,一是像c一样存储const变量,二是将const变量存入符号表。当你用到这个变量名字时,会直接从符号表取值,用指针时则会从变量的实际地址取值。为什么要说“对于内置类型”呢?因为对于用户定义的结构体,编译器是不会把它的const变量值存入符号表的。

用户定义类型的const变量示例:

#include <stdio.h>
#include <stdlib.h>
struct A
{
	int data;
};
int main()
{
	const A a = {1};
	A *pa = (A*)&a;

	printf("%d\n", a.data);
	printf("%p\n", &a.data);
	printf("%d\n", (*pa).data);
	printf("%p\n", &(*pa).data);

	system("pause");
}

输出结果

注意:当加上volatile关键字修饰const变量后,编译器每次也都会从变量的实际地址取值。

言而总之:修改const变量是未定义行为,不要写这样的代码,不过面试题中有可能会考到,了解一下总是好的。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-02 14:01:55

const变量探究的相关文章

const变量初始化问题

在C++中const变量定义时必须进行初始化,否则无法通过编译. 初始化的方式有多种,可以通过字面值对其进行初始化,也可以通过变量对其初始化,或其他方式,只要能给const变量赋初值即可(当然初值应该有其意义). 例: ? 1 2 3 int i = -1; const int ic1 = -1; const int ic2 = i; 不合法情况: const int ic = i; int *const cpi = &ic; 因为const指针cpi指向的不是一个const对象. const变

为什么为 const 变量重新赋值不是个静态错误

const 和 let 的唯一区别就是用 const 声明的变量不能被重新赋值(只读变量),比如像下面这样就会报错: const foo = 1 foo = 2 // TypeError: Assignment to constant variable. 注:本文不会使用“常量”这个术语,因为我觉的这个术语容易有歧义:有些人把数字.字符串等这些不可改变的字面量称为常量,也有人把一些只读属性称为常量,比如 Math.PI,还有人把 ES6 里用 const 声明的变量称为常量.不过一般来说,这点歧

C/C++ const变量的修改

C语言中的const是运行时const,编译时只有定义,只用在运行时才会初始化,这也是为什么const不能用来定义数组的原因,并且const的值也是可以动态修改的. C++中的const是编译时const,故能够用来初始化数组,企图修改const的值是未定义的,如果要修改const的值只能改变const变量的声明方式为 const volatile c=10. 测试用例: const int ci=10; int *j =(int *)&ci; *j=100; printf("%d,%d

程序猿之---C语言细节28(const变量初始化、数组大小用const变量细节、const变量与#define宏、volatile修饰)

主要内容:const变量初始化.数组大小用const变量细节.const变量与#define宏.volatile修饰 一.const变量初始化时必须赋值 二.const变量在C++中可以做数组大小元素.在C中不行,因为它是变量 三.const和#define区别:内存分配 四.volatile修饰一些变量:易被操纵系统.硬件.多线程修改的变量 #include <stdio.h> int main() { /* 测试1 */ const int b; // 不初始化会报错 // b = 2;

(转)const变量通过指针修改问题

程序笔试题-const变量通过指针修改问题 2012-10-06 20:45:18 分类: C/C++ const的变量在特定情况下可以通过指针修改,但是在另一些情况下是不能通过指针修改. 以下是VC6下才测试. 1 不能修改的情况 #include <stdio.h>int const a = 10;void main(void){ int *p = (int*)&a; *p = 20; printf("%d\n", *p);} 程序编译通过,但运行时错误: 指示

const变量赋值报错分析

const变量赋值报错分析 const变量赋值报错 从变量到常量的赋值是合法C++的语法约定的, 如从char 到const char顺畅: 但从char **到 const char **编译器就会报错: error: invalid conversion from `char**' to `const char**' 示例: int main(int argc, char *argv[]) { char a = '1'; const char b = a; char * a2 = "1234

生命周期,作用域的定义;说明全局变量、静态变量、局部变量、const变量的生命周期、作用域

生命周期,作用域的定义:说明全局变量.静态变量.局部变量.const变量的生命周期.作用域: 生命周期:是一个变量存在的周期. 作用域:是一个变量可以被引用的范围.最常见的如:{}.static修饰符等等. 1)全局变量: 作用域:全局作用域(只需要在一个源文件中定义,就可以作用于所有的源文件): 生命周期:程序运行期一直存在: 引用方法:其他文件如果要使用,必须用extern 关键字声明要引用的全局变量: 内存分布:全局(静态存储区). 注意:如果再两个文件中都定义了相同名字的全局变量,则连接

修改const变量

看下面的一段代码 1 const int i=0; 2 int * j=(int*)(&i); // 运行正确,j确为i的地址,但 int *j=&i; 编译错误 3 *j=1; //确实改变了i的值 4 printf("%d %d\n",i,*j); //输出0 1 第三行代码执行后,i的值确实已经改变 然而printf的结果确实0 1,这是因为,在C++中对于const变量,在编译期就进行了替换,运行的时候printf中i已经被替换为0了,而*j是从内存中从新取值.

构造函数初始化列表----主要为解决const变量的赋值而生

形式为 类内定义    Student:m_name("jo"),age(10){...} 类外定义    Student::Student(string name,int age):m_name(name),m_age(age){...} 注意:1)可以同时给多个数据赋默认值,以 逗号 隔开:    2)只能使用括号进行初始值赋值: 3)最后大括号{}内可以加其他函数---即初始化列表只能用于构造函数,且必须先于构造函数执行:    4)大括号{}结尾没有标点符号 ===>为何