const 修饰变量
例如:const int a = 0;
int main() {
// int const a = 0;// 和下面的写法意思是一样的
const int a = 0;
//a = 10; // 报错
int *p = &a;
*p = 10;
printf("a=%d\n", a);
system("pause");
}
a=10执行报错,因为变量的本质是一段连续内存空间的编号(门牌号)。C语言中,加const修饰,代表这个门牌号不能被修改,但它所指向的内存空间是可以被指针间接修改的。C语言中的const是个“冒牌货”。
const 修饰指针指向的内存空间
例如:const char *a;
int main() {
const char *a = malloc(sizeof(30));
memset(a, 0, sizeof(a));
//*a = "1233"; // 修改指针指向的堆空间报错
a = 111;// 修改指针变量本身不报错
system("pause");
}
指针所指向的内存空间不能被修改,但指针变量本身可以被修改。
const修饰指针变量本身
例如:char * const a;
int main() {
char * const a = malloc(sizeof(30));
memset(a, 0, sizeof(a));
*a = "111";// 修改指针指向的堆空间成功
//a= 1;// 修改指针变量本身报错
system("pause");
}
指针变量本身不能被修改,但它所指向的内存空间可以被修改。
const既修饰指针变量也修饰内存空间变量
例如:
const char * const a;// 那么指针变量本身 和 它所指向的内存空间都不能被修改。
总结:
1、看const是放在 * 的左边还是右边,放在左边就是修饰内存空间变量,放在右边就是修饰指针变量。
2、指针变量 和 它指向的内存空间变量,是两个不同的概念。