C之const小传
const, 常量(constant)修饰符.
const位置不同它所修饰的对象就不同, 下面依次验证.
const char * con = “abcdef”
指针符号 * 为右结合, 此式等效于 ` const char (* con) = “abc”; `.
也就是说const修饰的是 *con
这个存放char的空间, con
这个指针不受约束.
int main(int argc, const char * argv[]) {
const char * con = "abcdef";
const char * con2 = "aabbcc";
con = con2;
printf("%s\n", con);//aabbcc
return 0;
}
补充一点:
int main(int argc, const char * argv[]) {
const char * con = "abcdef";
printf("%c\n", *(con+2));//c
/*
"abcdef"为字符串常量,只读,与const无关.
*(con+2) = 'x';//非法
*/
return 0;
}
char const * con = “abcdef”
等价于 char const (* con) = "abcdef";
, 效果同上.
char * const con = arr;
int main(int argc, const char * argv[]) {
char arr [] = "abcdef";
char * const con = arr;
printf("%c\n", *(con+1));//b
*(con+1) = 'x';
printf("%c\n", *(con+1));//x
printf("%s\n", con); //axcdef
/*
char * arr2 = 'arr2';
arr = arr2; //非法, arr禁止修改
*/
return 0;
}
const char * const con = arr
int main(int argc, const char * argv[]) {
char arr [] = "abcdef";
const char * const con = arr;
/*
*(con+1) = 'x'; //非法
char * arr2 = 'arr2';
arr = arr2; //非法
*/
return 0;
}
清楚const修饰的是哪个部分之后, 就很容易知道哪个部分是禁止修改的.
const 在方法参数中
用意为: 不要在后面使用此参数时修改它.
int main(int argc, const char * argv[]) {
printf("argc:%d\n", argc);
printf("argv[0]:%s\n", argv[0]);
printf("argv[1]:%s\n", argv[1]);
printf("argv[2]:%d\n", atoi(argv[2]));
return 0;
}
/**
$ ./a.out 你好 798
argc:3
argv[0]:./a.out
argv[1]:你好
argv[2]:798
*/
小节
const 目的很明确–指定某个东西是不可修改的,如果非法在编译期就可发现.
可参考APUE 3edit 习题1.3思考.
2017-01-03 又记
char * a, b; //a is a pointer, b is a char.
*
右结合一次。
const int a;
int const a;
int 和 const 都是对a的声明,平级。
int const * p; // int const (*p) ;
const int * p; // const int (*p) ;
同理,int 和 const 是对 (*p)
的声明,平级。所以被约束的是 (*p)
,指到的内容不可改; p
这个指针无约束。
int * const p; // int ( * (const p) );
*
在修饰p之前,p就已经被约束为不可改了。p又是个指针,所以指针p不可改,指向的内容无约束。