- 若const出现在*左边,则 *p只读 p 可写;
- 若const出现在*右边,则 *p可写 p 只读;
- 若两边均有const,则p和*p都只读;
魔性记忆法:
- const* 可理解记忆为const *p,*p为值,值不可变只读,p可写;
- *const 可理解为 const p,p 为地址,地址不可变,只读,*p可写;
程序代码:
zxf@zxf-virtual-machine:test$ vim 8_constpoint.c
zxf@zxf-virtual-machine:test$ gcc -o 8_constpoint 8_constpoint.c
8_constpoint.c: In function ‘main’:
8_constpoint.c:9:19: warning: initialization from incompatible pointer type [enabled by default]
8_constpoint.c:11:2: error: assignment of read-only variable ‘p1’
zxf@zxf-virtual-machine:test$ cat 8_constpoint.c
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i=10,j=11;
int *const p1 = &i;
int const *p2 = &i;//const int *p;
int *const* p3 = &i;
p1 = &j;
printf("*p1 %d\n",*p1);
return 0;
}
zxf@zxf-virtual-machine:test$
解释:
这里是一个错误的代码,在这里用了给int *const p1;的p1指针赋值了这个是地址不可变的所以这里报了错;
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i=10,j=11;
int *const p1 = &i;
int const *p2 = &i;//const int *p;
int *const* p3 = &i;
*p1 = j;
printf("*p1 %d\n",*p1);
return 0;
}
zxf@zxf-virtual-machine:test$ ./8_constpoint
*p1 11
zxf@zxf-virtual-machine:test$
其它两种情况也是一样的,大家可以自己写程序验证一下。