一 const基础知识(用法、含义、好处)
int main()
{
const int a;
int const b;
int *const c;
const int *d;
const int *const e;
return 0;
}
第3行和第4行的意思一样 代表一个常整形数,在c中const修饰的常整型变量,其值不可以被直接修改,但是可以通过指向它的指针对它的值进行修改,如下面代码,但是这份代码在c++编译器中a的值最后还是10;所以c++不会修改。
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
int *p;
const int a = 10;
p = &a;
*p = 11; //const 修饰的常整形的变量,其值不可直接修改;但是可以通过指向它的指针对其的值进行修改;
// a = 11; //err const 修饰的常整形的变量,其值不可直接修改;
printf("a=>>>>%d\n", a);
system("pause");
return 0;
}
第5行中是一个常指针,即指针变量的值不以被修改,但是其指向的内存空间的数据可以被修改。
第6行是一个指向常整形数的指针,即指针所指向的内存空间的数据不可以被修改,但是其本身可以被修改。
第7行是一个指向常整形的常指针,即指针和他所指向的内存空间的值都不可以被修改。
二 c++中的const
在c++中,当编译器碰到const声明的变量时,它不再像c语言那样对变量进行单独的分配内存将它存入栈空间,而是,它会将const修饰的变量放入一个符号表中名值对中(简单讲就是一个关键字key对应一个唯一的值value),当你使用const修饰的变量的值时,编译器会直接将该值从符号表中拿出来让你使用,但是当你使用const修饰的变量进行取地址时,c++编译器会为这个变量单独的开辟一块内存空间,如下,编译器会为a在栈空间中单独的开辟一份内存空间,并让指针p指向该内存空间。在以后对p所指向的内存空间的值修改并不改变符号表中的a的值。
const int a = 10;
p = &a;
证明p所指向的内存空间的存在,我们可以使用printf("a:%d\n",a);
printf("*p:%d\n",*p);
打印出来之后我们发现*p=11,a=10;
因此我们可以得出C语言中的const变量是只读变量,有自己的内存空间
c++中的const变量编译器可能会分配内存空间,也有可能不会分配内存空间。即当我们对const修饰的变量取地址或const变量当做全局变量,被引用到其他文件中时,c++编译器都会为其分配内存空间。分配内存是在编译器编译期间。我们可以通过如下代码证明
void main()
{
int a;
const int b=10;
int c;
printf("&a:%d &b:%d &c:%d",&a,&b,c&);
}
因为const修饰的变量是在编译器编译期间进行分配内存,因此a b c 三个变量次压栈,b变量的地址在a和c中间。
三 const和#define的相同之处
#include<iostream>
int main()
{
int a = 10;
int b = 20;
int array[a + b]; //linux 内核成立但是c/c++都不支持
system("pause");
return 0;
}
这样一份代码在c/c++编译器中都会报错,但是我们将变量a和b使用const修饰之后这个代码就会通过编译,#include<iostream>
int main()
{
const int a = 10;
const int b = 20;
int array[a + b]; //linux 内核成立但是c/c++都不支持
system("pause");
return 0;
}
在这里const 将变量声明后,变量变为了类似 define a 10 这样的宏定义,在这一点上const和define完成了相同的功能。define是在编译器预处理阶段进行处理的。
三 const与define的不同之处
c++中const常量类似于宏定义 : const int a =5 ~ define a 5
c++中const常量与宏定义又不同,const常量是由编译器处理的,提供类型检查和作用域检查,而宏定义右预处理器处理,只用作单独的文本替换。
void fun1()
{
#define a 10
const int b = 20; //在某个函数中const 定义的变量只能作用于该函数,
//而define可以作用于全局,想要只作用于该函数必须卸载宏定义
#undef a //卸载a的宏定义
}
void fun2() {
cout << "a=" << a << endl; //报错 a未定义
cout << "b=" << b << endl; //报错 b未定义
}
int main(void)
{
fun1();
fun2();
system("pause");
return 0;
}
该博客文章是博主记录传智播客传智扫地僧C++课程讲义,如有侵权请联系删除!