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 这样的指针是要在声明时就要初始化才有意义,不能将它留空在那,希望以后再来给它赋值使用,这是不行的,同样会发生语法错误。 |