C语言const关键字

关键问题点:const 属于修饰符 ,关键是看const 修饰的位置在那里
1、const int a
这里const 修饰的是int,而int定义的是一个整值
因此
a 所指向的对象 值 不能通过 *a 来修改,但是 可以重新给 a 来赋值,使其指向不同的对象
eg:
const int *a = 0;
const int b = 1;
int c = 1;
a = &b //ok! 额外:注意不能通过a 来修改 b值
a = &c //ok! 额外:虽然c本身不是一个常量
*a = 2 //erro! 为题就在这里,不能修改通过 a 所指向的对象值,最后赋值得对象是c,因此不能通过a 来修改c值。
2、int *const a
这里const修饰的是 a ,a代表的是一个指针地址
因此不能赋给a其他的地址值,但可以修改a指向的值
这有点和cont int *a相反的意味,例子就不说了

3、至于int const *a 和 const int *a 的意义是相同的 他们两个的作用等价

补充:
4、const int * const a
这个代表a所指向的对象的值以及它的地址本身都不能被改变
5、 const int *const a

a所指向的对象及对象的值均不可改变。

关于const的点滴补充:
1、const 对象的地址只能赋值给指向const 对象的指针
2、指向const 对象的指针可以 被赋 以 一个非const 对象的地址
3、指向const 得指针常被用作函数的形式参数,保证被传递给函数的实际对象在函数得实际对象在函数中不会被修改
4、常量在定义后就不能被修改,所以它必须被初始化。未初始化的常量定义将导致编译错误(上面都是在说明const得问题,所以没有赋值,实际语句中要赋值的)

#include "stdio.h"
int a = 0;
int b = 1;
int c = 2;
int main(void)
{
	const int *pa = &a;    //值不能改变 
	int const *pb = &b;    //值不能改变 
	int * const pc = &c;   //地址不能改变 
	printf("*pa = %d\r\n*pb = %d\r\n*pc = %d\r\n",*pa,*pb,*pc);
	printf("pa = 0x%x\r\npb = 0x%x\r\npc = 0x%x\r\n",pa,pb,pc);
	pa = &b;   //地址改变,允许
//	*pa = 3;   //值改变,不允许 
	pb = &a;   //地址改变,允许
//	*pb = 3;   //值改变,不允许 
//	pc = &b;   //地址改变,不允许
	*pc = 3;   //值改变,允许 
	printf("*pa = %d\r\n*pb = %d\r\n*pc = %d\r\n",*pa,*pb,*pc);
	printf("pa = 0x%x\r\npb = 0x%x\r\npc = 0x%x\r\n",pa,pb,pc);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40831436/article/details/112196217