C以及C++在const的区别,以及const在C++的增强

C语言中const是一个伪常量,可以通过指针间接赋值改变,在C++中const得到加强,定义的是真常量。

const int a = 3;const int b = 4;int array[a + b] = { 0 };以上语句在C语言报错,在C++中通过,即可说明真伪常量的区别。

定义:const type name=value;注意:初始化和定义一起

C语言通过指针改变const值:

void test5()
{
	const int a ;
	//int const b; //const int , int const 是等价的

	int *p = (int*)&a;
	*p = 20;//C语言中可以通过指针的间接赋值改变const变量 

	printf("a = %d\n", a);
}

在C++中指针无法这样的原因是,C++没有像C语言一样给const常量分配内存单元,const常量被放在一个只读的符号表

例如定义一些const常量:const int a=10;   int const b=20;

符号表
namevalue
a10
b20
  

C++中使用如上指针变量间接赋值时,指针p指向的是编译器在栈中找的一个临时存储单元(即将临时空间的地址赋给p),因此在C++中,执行上述代码后,a的值没有改变。

 

不管是在C还是C++中int const b; const int b 是等价的,然而const int *a和int *const a却是有区别的。

const int *a  —— 一个指向常整形数的指针(所指向的内存数据不能被修改,但是本⾝(即地址)可以修改)

int *const a —— 常指针(指针变量不能被修改,但是它所指向内存空间可以被修改)

const int* const a —— 一个指向常整形的常指针(指针和它所指向的内存空间,均不能被修改)

用几个代码区分他们:

struct student
{
	int id;
	char name[64];
};

void change_stu(struct student *s)
{
	s ->id = 10;//常规指针变量
}

void change_stu2(const struct student *s)
{
	s->id=10; //此时s所指向的区域是一个常量 不能够被修改,报错
	struct student s2;//可以创建一个新的变量取其地址赋给s,编译通过,说明s本身是可以改变的
	s = &s2;
	cout << s << endl;
}

void change_stu3(struct student *const s)
{
	s->id = 10;//编译通过,s是一个常量指针,本身不可变,但指向的区域是可变的
	struct student s2;//再次报错,因为s是一个常量指针
	s = &s2;  
}

void change_stu4(const struct student *const s)
{
	s->id = 10;
	struct student s2;
	s = &s2;  //以上都是错的,s是一个指向常量的常量指针。
}

再来谈谈,const和#define的区别吧

1.编译阶段不一样:const是编译器处理,define是预处理器

2.const划分作用域,define是全局的

建议使用const

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值