const, 常量(constant)修饰符.

const位置不同它所修饰的对象就不同, 下面依次验证.

const char * con = “abcdef”

指针符号 * 为右结合, 此式等效于 ` const char (* con) = “abc”; `.

也就是说const修饰的是 *con 这个存放char的空间, con这个指针不受约束.

const1

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不可改,指向的内容无约束。