曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4726|回复: 0
打印 上一主题 下一主题

int const *p 与 int * const p 的区别

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2012-1-12 21:28:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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 这样的指针是要在声明时就要初始化才有意义,不能将它留空在那,希望以后再来给它赋值使用,这是不行的,同样会发生语法错误。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-4-28 02:47 , Processed in 0.062660 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表