三. C/C++中const异同总结

目录

C/C++全局变量

C/C++局部变量

C

C++

指针不可修改(const int a = 10)

指针可修改(变量初始化、自定义数据类型)

用const替代#define

#define MAX 1024

cosnt和#define区别


C/C++全局变量

1. c语言中全局const会被存储到只读数据段。而C++中全局const当声明extern或者对变量取地址时,编译器会分配存储地址,变量存储在只读数据段。

 const int constA = 10;
 int main(){
      int* p = (int*)&constA;
      *p = 200;
 }

2. C中const默认为外部连接,C++中const默认为内部连接。如果想让C++中const具有外部连接,必须显示声明为:extern const int a=10。

C/C++局部变量

C

c中的局部const存储在堆栈区,只是不能通过变量直接修改const只读变量的值,但可以跳过编译器的检查,通过指针间接修改。

C++

指针不可修改(const int a = 10

如果是基础数据类型,const int a=10此类,编译器会将其放入符号表中,不分配内存。我们对其取地址时会分配临时内存。故通过指针无法修改,例如下代码输出结果 m_A=10。

void test01()
{
	const int m_A = 10;
	int* p = (int*)&m_A;
	*p = 100;
	cout << "m_A=" << m_A << endl;
}

指针可修改(变量初始化、自定义数据类型)

1. 变量初始化cosnt

如果用一个变量初始化const变量,如const int a = b,那么也是会给a分配内存。会分配内存的变量就能用指针去修改。

void test02()
{
	int a = 10;
	const int b = a;    //会分配内存,只有是分配内存的变量就能用指针去修改

	int *p = (int*)&b;
		*p = 1000;
	cout << "b=" << b << endl;
}

2. 自定义数据类型

对于自定义数据类型,也会分配内存,分配内存就能通过指针修改

struct Person
{
	string m_Name;
	int m_Age;
};
void test03()
{
	const Person p1;
	Person* p = (Person*)&p1;
	p->m_Age = 18;
	p->m_Name = "德玛西亚";
//	(*p).m_Age = 18;
	cout << "姓名:" << p1.m_Name << "年龄:" << p1.m_Age << endl;
}

用const替代#define

#define MAX 1024

对于标题语句,我们定义的宏MAX从未被编译器看到过,因为在预处理阶段,所有的MAX已经被替换为102了,于是MAX并没有将其加入到符号表中。此时可能偶会会报出编译错误,错误中提到1024。

建议用const int MAX=1024替代

cosnt和#define区别

1. const有类型,可进行编译器类型安全检查;而#define无类型,不可进行类型检查。

2. cosnt有作用域,而#define不重视作用域,默认定义到文件结尾,需卸载宏常量(#undef MAX),#define作用域从定义到文件结束或者到#undef。如果定义在指定作用域下有效的常量,则#define不能用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值