3、const的用法---普通用法+用于指针

1)   const修饰普通变量

int const a;//把a声明为一个整数,值不能修改。虽然此时未赋值,也不能再赋值,所以只能在声明的时候赋值,如int const a = 10;

const int a;//同上。

例子:const int a= 100;

     char buffer[a];//这是错误的。因为a总是占用内存,C编译器不知道它在编译时候的值,不能把它看成一个编译时期的常量a 只是一个不可改变的变量。这是和define定义常量时候的区别。如define PI 3.14;

12)  #include <iostream>
using namespace std;


void main()
{
//const int a = 2;
int ival=2;
const int a = ival;
int *b = (int *)&a;
*b = 3;

//cout << ival<<endl;//2
cout << a <<endl;//3
cout << (*b) <<endl;//3
}

很多人都会觉得这里会有编译错误,既然a是不可改变值的,这里*b = 3;就会出现编译错误。其实不是这样的,运行结果是:

3

3


13)再看和上面类似的一段代码

  #include <iostream>
using namespace std;


void main()
{
const int a = 2;
//int ival=2;
//const int a = ival;
int *b = (int *)&a;
*b = 3;
cout << a <<endl;//a在内存中的值是2,但是输出的时候,编译器对其优化了.如果改为volatile,表示易变的.输出结果应该是3 3 
cout << (*b) <<endl;
}

它的运行结果是

2

3

14)最后看这样一个代码

  #include <iostream>
using namespace std;


void main()
{
const int a = 2;
a=3;
cout << a <<endl;
//cout << (*b) <<endl;
}

这段代码才会出现编译错误,因为不能直接修改a的值。

类似的

以下程序会出错.

 #include <iostream>
using namespace std;
const int a = 2;//全局变量,存储在内存中的数据区,受操作系统保护的内存,不可修改值.只读.

void main()
{

a=3;
cout << a <<endl;
//cout << (*b) <<endl;
}

从以上例子可以看出,其实a 的值不是不能改变,只是不能直接改变而已。

可是12)和13)的运行结果竟然是不同的,很奇怪其中的原因,希望得到高手的指点。

2)const用于指针

const int * a;//a是一个指向整型常量的指针。指针的指向可以变,但是指针指向的值不能变。

int const * a;//同上

int * const a;//a是一个常量指针。指针的指向不可以变,但可以修改指针指向的整型的值。

const int const * a;//指针的指向和指针指向的值都不能改变。

例如:int a = 5;

      int b = 3;

      const int * p = &b;

      b = 1;//是错误的。因为指针指向的值不可以改变。

      p = &a;//是正确的,因为指针的指向可以改变。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值