const关键字

const关键字

在c语言中由于广泛使用指针,因此可能稍有不慎就会造成程序崩溃。使用const关键字可以对传入参数进行保护。
const关键字用于将一个变量声明为只读,也就是常量。无法被修改。也就是所谓的常变量。

const修饰数组

用const修饰数组声明一个数组常量,是对数组中数据的保护。const修饰的数组中的内容不能被改变。
但是需要注意的是,const修饰数组还是不能保证安全的。使用某个指针指向这个数组,可以通过这个指针来修改数组中存储的内容。

const  基本类型  数组名[];
int main(){
	const int nums[5]={1,2,3,4,5};
	int *p=nums;
	for(;p<nums+5;p++){
		(*p)++;		//有警告,但是编译通过
	}
	//nums[0]++;		编译报错,直接显示数组read-only
	int i=0;
	for(;i<5;i++){
		printf("%d",nums[i]);
	}
	return 0;
}

虽然有警告,但是仍然可以编译通过。这就是指针带来的隐患。指针是直接操作内存,很容易出错。

const修饰指针

const可以修饰指针,但是const的位置不同,带来的效果也不同。

const  基本类型  *指针变量名;	      //指向常量的指针  指向const的指针
基本类型 *const  指针变量名;	      //指针常量  const指针

举例:
int nums[5]={0,1,2,3,4};
const int *p1=nums;		//const修饰int,意味着指向的值不可边,指针本身可变。
//*p1=6;	编译报错。
p1++;		//编译通过。p1指针变量本身可变。
int * const p2=days;		//const修饰指针,意味着指针本身不可修改,但是其指向的值可以修改。
//p2++ 	            编译报错
//p2=&nums[1];		编译报错
*p2=10;	//编译通过

当然,可以用两个const来修饰一个指针:

const 基本类型 *const 指针名
const int *const p;

这可以保证指针本身不能变,指向的值也不能变。

对指向const的指针进行地址赋值

对于:

const 基本类型 *指针名;指向const的指针

指针本身可以改的。对它进行地址赋值时,可以赋值常量或非常量的地址。但是对于普通指针而言,只能赋值非常量数据的地址,而不能将常量数据的地址赋值给普通指针。会显示非法警告,但是仍然可以编译通过。

int main(){ 
	int nums1[5]={0,1,2,3,4};
	const int nums2[5]={0,1,2,3,4};
	const int *p1;
	int *p2;
	p1=nums1;	//合法,赋值非常量变量地址
	p1=nums2;	//合法,赋值常量变量地址
	p2=nums2;	//非法,warning,但是仍然可以编译。
	return 0;
}

const修饰形式参数

对于传入函数的指针,可以在形参上加上const,保证函数内部不会修改原指针指向的值。此时实参指针不一定非要是指向常量的指针。函数会把该指针作为常量对待。
const只有在修饰指针参数时才有意义,因为非指针进行的是值传递。

void foo(const int *bar)void foo1(int *bar);

foo函数可以传入常量指针或者非常量指针,函数内部都不会去修改指正指向的值;
foo1函数可以传入非常量指针,当传入常量指针时,函数会warning非法,但是还是可以编译通过。因为不能保证函数内部会不会修改常量指针指向的值,可能因此运行出错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值