C语言-const关键字

1.const 关键字

       const 是 constant 的缩写,const 在实际编程中用得比较多,意思是“恒定不变的”,它是定义只读变量的关键字,或者说 const 是定义常变量的关键字。 (可读,不可写)

       const 可以修饰变量,数组,指针等: 说 onst 定义的是变量,但又相当于常量;说它定义的是常量,但又有变量的属性,所以叫常变量。用 const 定义常变量的方法很简单,就在通常定义变量时前面加 const 即可,如:
                       const int a=10;
const 和变量类型 int 可以互换位置,二者是等价的,即上条语句等价于

                        int const a = 10:
那么用 const 修饰后和未修饰前有什么区别呢? 用 const 定义的变量的值是不允许改变的,即不允许给它重新赋值,即使是赋相同的值也不可以。所以说它定义的是只读变量。这也就意味着必须在定义的时候就给它赋初值。无论是全局常变量还是局部常变量都必须初始化赋值

         const在c语言中,最主要就是不修改值的函数,指针形参前加const 

int main()
{
	int a = 10;
	int b = 20;
	const int ca = 10;//不能改
	int *p = &a;
	p = &b;
	//p = &ca;//error  假如合法  ,*p = 100;->ca=100
	const int *p2 = &ca;//ok
	//*p2 = 20;//error
	//int *const p3 = &ca;//error
	const int *p4 = &a;
	int *const p5 = &a;
	//p = p2;//error
	return 0;
}

 

 

const 修饰变量和数组:

//const 规则1
int main()
{
	int a = 10;//可读,可写
	printf("%d\n",a);//读
	a = 100;//写
	const int ca = 10;//常变量,只读
	printf("%d\n",ca);//读
	a = ca;//ca读
	//ca = 100;//error
	int const cb = 10;//完全等同ca
	//cb = 20;//error

	return 0;
}
//const 规则2
int main()
{
	int a = 10;
	int b = 20;
	int *p = &a;
	p = &b;//p,写
	*p = 100;//*p,写
	const int *cp1 = &a;
	//*cp1 = 100;//error
	cp1 = &b;//ok
	
	int const *cp2 = &a;//等同cp1(规则1)
	//*cp2 = 100;//error
	cp2 = &b;//ok

	int *const cp3 = &a;
	*cp3 = 100;//ok
	//cp3 = &b;//error
	
	const int *const cp4 = &a;//不使用
	//*cp4 = 100//error
	//cp4 = &b;//error
	
	 //a + b;

	return 0;
}

const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。
const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点。

2.const与指针配合使用的作用

const修饰指针变量的时候:
1、const如果在 * 的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。但是指针变量本身的内容是可变的。
2、const如果放在 * 的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指针指向的内容,可以通过指针改变。
   限制指针变量 ;限制指针变量指向的数据; 既要限制指针变量又限制指针变量指向的数据(双重限定)

1)限制指针变量本身
   如: int * const p;
    限制指针变量本身的意思是,指针变量本身的值不能被修改,但指向可以改变。所以被 const 修饰的指针变量指针只能在定义时初始化,不能定义之后再赋值,代码如下:

 

 2) 限制指针变量指向的数据

   如: const int *ip;
           int const *ip;
       上面两种写法都可以,一般使用第二种,限制指针变量指向的数据的意思就是指针可以指向不同的变量(指针本身的值可以修改),但是不能用指针修改指针指向的数据的值,代码如下:

 

 3)限制指针变量和指针变量指向的数据的值

     如: const int * const ip;
上面这种写法使指针变量和指针变量指向数据的值都不能修改, 代码如下:

 

3.const 与 define 的区别

从功能上说它们确实很像,但它们又有明显的不同:
1.#define 是预编译指令,而 const 是普通变量的定义,#define 定义的宏是在预处理阶段展开的,而 const 定义的只读变量是在编译运行阶段使用的。
2.const定义的是变量,而 define定义的是常量。define定义的宏在编译后就不存在了,它不占用内存,因为它不是变量系统只会给变量分配内存。但 const 定义的常变量本质上仍然是一个变量,具有变量的基本属性,有类型、占用存储单元。可以说,常变量是有名字的不变量,而常量是没有名字的。有名字就便于在程序中被引用,所以从使用的角度看,除了不能作为数组的长度,用 const 定义的常变量具有宏的优点,而且使用更方便,所以编程时在使用 const和 define都可以的情况下尽量使用常变量来取代宏。
3.const定义的是变量,而宏定义的是常量,所以const 定义的对象有数据类型,而宏定义的对象没有数据类型。所以编译器可以对前者进行类型安全检查,而对后者只是机械地进行字符替换,没有类型安全检查。这样就很容易出问题,即"边际问题”或者说是“括号问题"

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值