一、首先介绍C语言中的const功能。
const int a;
int const b;
//以上两种定义方式相同,a、b都是一个常整型数
const int *c;
//c是一个指向常整型数的指针(所指向的内存数据不能被修改,但指针本身可修改)
int * const d;
//d是常指针(指针变量不能被修改,但d所指向的内存空间可被修改)
const int * const e;
//e是一个指向常整型的常指针(指针和其所指向的内存空间,均不能被修改)
二、开始比较C语言与C++中的const区别。
在C语言中,若采用以下代码,输出结果都为50。
#include<stdio.h>
int main(void)
{
const int a = 10;
int *p = &a;
*p = 50;
printf("a=%d\n",a);
printf("*p=%d\n", *p);
return 0;
}
而在C++中,采用以下代码,输出结果a为10,*p为50。
#include<iostream>
using namespace std;
int main(void)
{
const int a = 10;
int *p = (int*)(&a);
*p = 50;
cout << a << endl;
cout << *p << endl;
return 0;
}
以上结果说明,其实C语言中定义的是“假”常整型变量,C++中定义的才是“真”的常整型变量。在执行const int a = 10时,编译器会创建一个符号表,其中的a并没有所谓的空间和地址,符号表给a一个值为10,一旦使用到a,就赋为10。其功能与define类似,但define是在预处理阶段执行,而const是在编译阶段执行。
此时,有个问题,a是个常量10,常量是没有地址的,*p对其取地址又是什么意思呢?其实在C++中,如果对一个常量取地址,编译器会临时开辟一个空间temp,让这个指针p存放这个临时空间的地址。在上面的代码中,即会定义一个int temp,让p来指向这个temp,所以在执行 *p=50的时候不会出错,其改变的是临时开辟的temp变量而不是a。
网友评论