c语言,常量与指针
预想中的6种写法:
const * int p; //error
const int * p;
int const * p;
int * const p;
* int const p; //error
* const int p; //error
因为 *是右结合的;
const int *p; == int const *p; //const 修饰*p,即指针指向的值不可改,
int *const p; 相当于 *p + const p; p保存的是地址,且p本身不能变。(指针指向不能变)
关于赋值(忽略语法问题):
指针指向是否可变 | 能否用*p改值 | 能否直接改a | |
---|---|---|---|
const int *p = const int a | |||
const int *p = int a | |||
int *const p = const int a | |||
int *const p = int a | |||
int *p = int a | |||
int *p = const int a |
const int a = 1;
const int b = 2;
int c = 3;
int d = 4;
const int *p = &a; //*p是 const 指向可变,内容不可变
printf("%d\n",*p);
//*p = 999; error
p = &b;
printf("%d\n",*p);
p = &c;
printf("%d\n",*p);
指针指向是否可变,能否用*p改值由左边决定
能否直接改值由右边决定
问题:能否通过(没有限定指向一定要是常量的)指针改 常量
我最初的想法是不可以,我认为 左右两边要同时满足可以改值的条件才可以,但结果并不是这样:
结果是可以,出乎意料。
同样的:指向常量的指针指向非常量时,也可以直接改常量。如下:
c++中
int *const b; //error //c语言没有要求在定义时就一定要赋值
int *const b = &a; //可以
必须在声明时赋初值