const 用法:定义常量,修饰指针、函数的输入参数和返回值,把定义或者修饰的变量属性设为只读。本质上它只是在全局数据段或者栈中定义的是一个只读的常量,不是真正位于字符串常量区。所以关键字const并不能把变量变成真正的常量,事实上还是可以改变const定义的变量的值。const的目的是为了产生高质量的代码,提高代码的可读性,同时保护好不能被任意改变的内存。
关键字const需要注意的问题:
问题一:const变量与常量
1、用可读变量定义数组长度
例如:const int n = 4;
int sum[n] = {0};
ANSI C的编译器会报告有错误,因为ANSI C规定数组定义时长度必须是“常量”。而n是一个变量,只是被定义为只读而已。从这里可以看出只读变量和常量还是存在差别的。但是在其他例如GCC编译器中却没有提示错误报告。
2、可读变量初始化
例如:const int b;//提示警告
const int a = 8; //n为常量,不能直接赋值改变a的值(a = 9;错误)
int const a = 8;//效果是一样的
const定义变量时必须要进行初始化赋值,否则会提示警告。而且如果不进行初始化则该变量也毫无意义,因为该变量只能永远是一个不定值。(VC中没有初始化只提示警告)
3、const定义的变量修改内容。
int main()
{
const int a = 2;
int *p = &a;
*p = 3;
printf("int = %d\n",a);
}这个程序最终输出的结果是3;
问题二:const与指针
1、指针指向的内容为可读
const int *p = &a;//指针指向的内容只读,不能通过该指针去修改写,但是这个指针本身可以改变。
int main()
{
int a = 2;
int b = 3;
const int *p = &a; //指针p指向a的只读
*p = 12; //错误,P指向的内容为只读,不能通过该指针去改变其指向的内容
P = &b; //正确,把指针指向b
}
2、指针本身为可读
int * const p = &a;//指针本身为可读,指针初始化到一个对象后,将不能被修改。
int main()
{
int a = 2;
int b = 3;
int * const p = &a; //p本身为指针,即a的地址
P = &b; //错误,指针本身可读不能修改
*p = 12; //指针指向的内容可以修改
}
const和指针一起使用是C语言中一个很常见的困惑之处,上面的两点大家一定要分清楚
问题三 :const与函数
1、修饰函数返回值
const char *foo(void) //修饰返回值,表示返回的指针指向的内容只读
{
char *p = “string”;
return p;
}
2、定义函数参数
void foo(const char *str)
{
*str = 8; //错误
const char *p = str; //p必须为const,才能接受str
}