首先摆出代码:
int main() {
@autoreleasepool {
int a = 10;
const int *p = &a;
int const *p2 = &a;
int * const p3 = &a;
int b = 20;
*p = 12;
p = &b;
*p2 = 12;
p2 = &b;
*p3 = 12;
p3 = &b;
printf("%d",*p);
printf("%d",*p2);
printf("%d",*p3);
}
}
问:最后输出结果是?
答案:
const
解释:
const的用法:修饰的部分不可变,为常量,但是不会改变变量的作用域和生命周期。
情况1:
const int *p = &a
此时const修饰的是p,也就是p所指向的内存地址的值!!,所以当尝试使用p改变被const修饰的常量时,编译器报错,只读的变量不可以被再次赋值;
情况2:
int const *p = &a;
此时const修饰的仍然是*p,同情况1;
情况3:
int *const p = &a;
此时const修饰的是变量p,也就是局部变量p不能被改变,所以当尝试使用*p改变p所指向的内存地址a的值时,是可行的。但是当尝试重新给p赋值,让其指向b的内存地址时,编译器报错。
情况4:
int const c = 10;
const int c = 10;
这中情况同情况一和情况二一样,都是修饰变量c,也就不存在指针那么复杂的情况。
const和宏
const编译时确定,如果出错,编译器会报错;
宏是预编译,只做拷贝操作,不会报错;
const不能定义函数;
宏可以定义函数
网友评论