注:在gcc4.8.5中做的实验
1.const修饰的变量是只读的,此变量不能作为左值被改变,但其本质还是变量,而不是常量,通过指针的方式可以改变const修饰的变量的值
例如:
int const a = 2; //a为只读属性
int *p = (int*)&a;
a = 3; //错误
*p = 5;
printf("a = %d\n", a);//a的值被改变
2.const修饰的数组是只读的,不能让 数组名[下表] 做左值,同样,通过指针的方式可以改变const修饰的数组元素的值
const int arr[5] = {1, 2, 3, 4, 5}; //数组元素为只读属性int *pa = (int*)arr;
int i = 0;
/* for(i = 0; i < 5; i++)
{
arr[i] = 5 - i; //错误
}
*/
for(i = 0; i < 5; i++)
{
*(pa + i) = 5 - i; //数组arr内元素的值被改变
printf("arr[%d] = %d\n", i, *(pa+i));
}
3.const修饰指针
int const *p; //指向常整型书的指针,p可修改,p指向的内容不可修改,但可利用其它指针修改其内容
int c = 8;
int const *ps = &c;
int *pd = &c;
*pd = *pd + 2;
printf("%d\n",*ps);//*ps的值为10,利用*pd改变了*ps指向的内容
int *const p; //指向整数的常指针,p值不能修改(不能p++),p指向的内容可变
int *const pp = (int*)&arr[1];*pp++; //pp为只读变量,不能改变
printf("%d\n",*pp);
4.const修饰函数参数表示在此函数中,此参数不能被改变
void f2(const int a){
a++; //错误:令只读形参‘a’自增
printf("%d\n",a);
}