const关键字
在C语言中,const关键字可用来修饰一个变量转为常量,使其值不可以再被修改:
const int i = 1;
i = 4; //FALSE
但我们仍然可以利用指针来间接修改变量的值,需要说明的是,这种操作虽然可行,但属于违法操作,应该避免使用。这部分知识与本次讨论的问题无关,只需简单了解即可。
const int i = 1;
printf("before i = %d\n", i);
int* p = &i;
*p = 2;
printf("after i = %d\n", i);
常量指针与指针常量
常量指针用如下方式来定义:
const int *p
int const *p
指针常量用如下方式来定义:
int *const p
注意 * 号的位置,能够帮你很好的区分两者
常量指针的性质
1.常量指针所指空间的内容不可以修改
为了方便解释,这里简单加一个括号
const int (*p)
仔细观察 *p 的位置, 与 const int i 中变量所在的位置一样,如此就很好理解了,变量 i 的值不可以被修改,同理 *p ,即 p 所指空间的内容不可以修改,但通常我们会令 p 指向一个变量,直接修改变量值的方法还是可用的。
int i = 1;
const int* p = &i;
i = 10; //TRUE
//*p = 10; //FALSE
printf("%d\n", *p);
2.常量指针的指向可以发生变化
int i = 1,j = 10;
const int* p = &i;
printf("before *p = %d\n",*p);
p = &j;
printf("after *p = %d\n", *p);;
指针常量的性质
指针常量与常量指针的性质刚好反过来
1.指针常量所指空间的内容可以修改
int i = 1;
int* const p = &i;
printf("before *p = %d\n", *p);
*p = 10;
printf("after *p = %d\n", *p);
2.指针常量的指向不可以发生变化
常量指针的应用
根据常量指针,可修改指向,不可以修改内容的性质,可有如下应用
char* strcpy(char* destination, const char* source);
FILE* fopen(const char* filename, const char* mode);
以 strcpy 函数为例,参数二是一个常量指针,这就意味着对源字符串操作的同时并不会改变其内容,所以当你看到一个为常量指针的形参,就可以大胆的传入参数,而不用担心传参的同时内容被修改。