前言
本文介绍 const 的几种使用方式。
正文
-
const char p 与 char const p 等价, 都是限定了字符类型变量 p 所在的内存数据不可更改。
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { const char p; char const q; p = 'p'; q = 'q'; return 0; }
-
const char *p 与 char const *p 等价,都是限定了指针 p 指向的 字符对象 所在的内存数据不能更改,而指针变量 p 本身所在的内存数据可以修改,即是 p 可以指向其他位置。
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { const char *hstr = "hello"; hstr = "world"; // valid hstr[0] = 'i'; // 编译报错,提示 *hstr 被分配到只读的内存位置 hstr[1] = 'i'; // 编译报错,提示 *(hstr + 1) 被分配到只读的内存位置 return 0; }
-
char * const p 限定了指向字符对象的指针变量所在的内存数据不可更改,即是 p 不能指向其他位置,但是 p 所指向位置的数据可以更改。
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { const char *hstr = "hello"; char * const dst = (char *)malloc(sizeof(hstr) / sizeof(char)); memcpy(dst, hstr, sizeof(hstr) / sizeof(char)); //valid 修改了 dst 指向的位置的数据 printf("%s\n", dst); char *p; dst = p; // 修改 dst 的指向,编译报错,提示 dst 被分配到只读的内存位置 return 0; }
-
const char * * p 与 char const * * p 等价,同第一种,只限定了字符对象不可更改,指向该字符对象的地址的指针 p 本身可改动,p 指向的位置所保存数据(存的是该字符对象的地址)也可更改。
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { const char * temp = (char *)malloc(5); const char ** dst = &temp; const char * hstr = "hello"; dst = &hstr; // valid,dst 本身改动 *dst = hstr; // valid,dst 指向的位置可更改 printf("%s\n", *dst); (*dst)[0] = 'i'; // 试图更改最终指向的字符对象数据,编译报错,提示 **dst 被分配到只读的内存位置 (*dst)[1] = 'i'; // 试图更改最终指向的字符对象数据,编译报错,提示 *(*dst+1) 被分配到只读的内存位置 return 0; }
-
char * const * p 类似第二种,限定了指向(指向字符对象的指针变量)的指针指向的位置的数据不可更改,即指针 p 本身可以更改,*p 不能更改,**p 可更改。
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char * temp = (char *)malloc(5); char * const * dst = &temp; char * p; (*dst)[0] = 'i'; // valid, 更改最终指向的字符对象,即 *(*dst + 0) == **dst dst = &p; // valid,更改双重指针 dst 本身 *dst = p; // 试图更改 dst 指向的位置的数据,即 *dst,编译报错,提示 *dst 被分配到只读的内存位置 return 0; }
结语
写到后面我也快晕了,可以边看例子边画图来理解。
关键字 const 并不能把变量变成常量!在一个符号前加上 const 限定符知识表示这个符号不能被赋值。也就是它的值对于这个符号来说是只读的,但它并不能防止通过程序的内部(甚至是外部)的方法来修改这个值。const 最有用之处就是用它来限定函数的形参,这样该函数将不会修改实参指针所指的数据,但其他的函数却可能会修改它。 ---- 摘自《C专家编程》