c/c++中的const

一 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++课程讲义, 如有侵权请联系删除!



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值