曲径通幽论坛

标题: int const *p 与 int * const p 的区别 [打印本页]

作者: beyes    时间: 2012-1-12 21:28
标题: int const *p 与 int * const p 的区别
int const *p 和  int * const p 看着类似,但着实有区别。

int const *P 表示 p 指向的整数值不能改变;而 int *const p 表示指针 p 不能改变。

测试代码一:
[C++] 纯文本查看 复制代码
#include <stdio.h>


int main()
{
    int val = 10;
    int const *p = &val;


    *p++;


    printf ("%d\n", *p);


    return 0;
}

可以编译通过,但不能认为会输出 11 ,而是输出一个未确定的值,因为 * 和 ++ 虽然具有同样的优先级,但它们的结合方向是从右向左,因此会先进行指针的增一,然后再取值。

将上面的代码中的 *p++ 改为 (*p)++; ,再编译则出错:
[beyes@beyes   normal]$ gcc intp.c -o intp
intp.c: In function ‘main’:
intp.c:8:2: error: increment of read-only location ‘*p’
因为程序中已经事先声明 p 所指向的地址中的值是 const 的 (int const *p),所以这里想对 *p 进行加一,那么必然出错。如果将程序中的 const 去掉,那么可以编译通过并输出值 11 。

假如我们将程序中的 int const *p; 声明改为 int *const p = &val; ,则 (*p)++; 这样使用指针,那么是正确的,因为此时 p 是 const 而是 *p 是 const,也就是说,p 所指向的值是可以改变的,如:
[C++] 纯文本查看 复制代码
#include <stdio.h>


int main()
{
        int val = 10;
        int *const p = &val;


        (*p)++;


        printf ("%d\n", *p);


        return 0;
}

运行输出:
[beyes@beyes   normal]$ ./intp
11
但是像上面,将 (*p)++ 的括号去掉变成 *p++ 这样就会出错了,原因是此时 p 是个 const 指针,它不能组做 ++ 或 -- 等移位运算。若编译一下,可以看到下面的错误:
[beyes@beyes   normal]$ gcc intp.c -o intp
intp.c: In function ‘main’:
intp.c:8:2: error: increment of read-only variable ‘p’

另外像 int *const p 这样的指针是要在声明时就要初始化才有意义,不能将它留空在那,希望以后再来给它赋值使用,这是不行的,同样会发生语法错误。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2