c++里的const

一、三种用法
1.const int *p; //锁定指针指向内存空间值
eg:
int a=10,b=5;
const int *p;
p=&a;
*p=20; //编译错误原因:指针指向内存空间值为定值
结果:1>e:\程序\test\test\源.cpp(8): error C3892: “p”: 不能给常量赋值


2.int * const p; //锁定指针值(即指针的指向不能改变)
eg:
int a=10,b=5;
int *const p=&a; //注意:指针值为定值时需要给指针赋初值
p=b; //编译错误原因:指针值为定值
结果:1>e:\程序\test\test\源.cpp(7): error C3892: “p”: 不能给常量赋值

3.const int *const p; //既锁定指针值,又锁定指针指向内存空间值
eg:
int a=10,b=5;
const int *const p=&a;
p=&b; //编译错误原因:指针值为定值
*p=20; //编译错误原因:指针指向内存空间值为定值
结果: 1>e:\程序\test\test\源.cpp(8): error C3892: “p”: 不能给常量赋值
1>e:\程序\test\test\源.cpp(8): error C3892: “p”: 不能给常量赋值

二、c与c++中const的不同(c是冒牌货)
c里的const定义常量可以通过指针指向改变指针指向空间的值
c++里的const定义常量被放在符号区,当有指针指向时会在内存 重新划分空间并复制。原变量不改变,但可以改变指针指向空间值
eg:
c编译器里
#include <iostream>
using namespace std;
void main()
{
const int a=10;
int *p=&a;
*p=20;
cout<<a<<endl;
system("pause");
}
运行结果为 20(此时输出指针值也为20,指针与变量代表同一块内存空间)
c++编译器里
#include <iostream>
using namespace std;
void main()
{
const int a=10;
int *p=(int *)&a;
*p=20;
cout<<a<<endl;
system("pause");
}
运行结果为 10;(此时输出指针值为10,指针指向的空间是后来复制在内存空间的,此时变量值储存在符号区,是个定值)
结论:c里的const可以通过指针修改变量值,是冒牌货,c++里不行.

三、const与#define的不同
#define在预编译阶段就执行,是简单的文本替换,作用域是整个文件,可在后面取消文本替换(即缩小作用域):用undef结束文本替换
const定义变量在编译阶段开始执行内存划分,作用域一般为变量作用域。
eg:
#include <iostream>
using namespace std;
void f1();void f2();
void main()
{
f2();
system("pause");
}
void f1()
{
#define a 10
const int b=20;
}
void f2()
{
cout<<a<<endl;
cout<<b<<endl; //编译错误原因:此时b的作用域只在函数f1里,a的作用域是整个文件
}
结果:error C2065: “b”: 未声明的标识符

问题:此时如何缩小a的作用域?
void f1()
{
#define a 10
const int b=20;
#undef a; //取消a的预编译文本替换即可
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值