首先说明:int *p 等价于 int* p;
int *p:
定义了一个指针,指向一个整型类型的变量;其中,p(地址)可变,*p(值)也可以变;
int const* p:
定义了一个指针,指向的是整型常量,即:可以修改指针的值,但不能修改所指向的值。所以p(地址)可变,*p(值)不可变;
int const *p2;
const int *p3; //int cont *p2 和 const int *p3 是一样的,代表 p(地址)可变,但不能通过*p修改值,因为*p 是常量,不能被赋值
int i1=30;
int i2=40;
p2=&i1; //指针p2,新的内存地址,是i1的地址;
printf("pointer address is %d,value is %d\n",p2,*p2);
p2=&i2;
printf("pointer address is %d,value is %d\n",p2,*p2);
/**** 不能用*p2 来改变指针指向的值,因为指针指向的是整型常量,是不能变的,不能被赋值 ***********/
//*p2=188;
//printf("pointer address is %d,value is %d\n",p2,*p2);
//*p2=i1;
//printf("pointer address is %d,value is %d\n",p2,*p2);
首先说明下,int const *p 和const int *p 是等效的;
因为指针值(地址)可变,所以可以通过p2=&i1,p2=&i2 的方式,来改变指针的值;
但是,不能通过*p2=188, 或者*p2=i2 的方式来改变指针指向的值。
int *const p:
定义了一个 常量指针,指向一个整型变量。此时,指针是常量,不能修改,但可以修改指针指向的值。即p(地址)不能修改,但*p(值)可以修改。
/***不能这样给p4赋初始值,因为前面定义的时候已经自动为他分配地址了**/
//int *const p4; //一个常量指针(地址不可变),指向一个整型变量(值可变)
//p4=&i1; //给指针初始化,值为i1的地址, 因为是常量指针,不能再二次赋值了,永远是这个地址
int *const p4=&i1;
printf("pointer address is %d,value is %d\n",p4,*p4);
i1=50;
printf("pointer address is %d,value is %d\n",p4,*p4);
/*****/
*p4=i2;
printf("pointer address is %d,value is %d\n",p4,*p4);
对于这种类型的指针,
如上图代码,
int *const p4;
p4=&i1, 这种写法对指针进行初始化是错误的,因为定义指针的时候就分配地址了。
所以只能 int *const p4=&i1;
因为指针指向的值是可以变得,所以可以通过*p4=i2 的方式,来改变指针指向的值;
int const *const p:
定义了一个常量指针,指向一个整型常量。这里指针本身(地址),及其指向的值,都是常量,不能修改。
int i3=100;
int const *const p5=&i3; //一个常量指针(地址不可变),指向一个const int 常量,值不可变;
printf("pointer address is %d,value is %d\n",p5,*p5);
i3=200;
printf("pointer address is %d,value is %d\n",p5,*p5);
/*****P5 read-only,不能再赋值****/
//p5=&i1;
//printf("pointer address is %d,value is %d\n",p5,*p5);
/******** *p5 read-only,不能再赋值 *********/
//*p5=120;
//printf("pointer address is %d,value is %d\n",p5,*p5);
int const i4=110;
int const *const p6=&i4;
printf("pointer address is %d,value is %d\n",p6,*p6);
运行结果:
再运行一次,结果:
说明:
这里p5,p6 都是指向常量的常量指针,在定义的时候就完成了初始化。
对于p5来说,程序每次运行的时候,给变量i3 赋地址,p5的值就是i3的地址,他指向的值,即*p5,就是i3的值,即100;
前面提到,指向整型常量的常量指针,指针和指针指向的值,都不能变;
这里说的是,p5,*p5都是read-only,所以不能赋值,但是,直接给i3赋值,从而使*p5变化,是可以的。
而对于p6,因为指向的是i4,是整型常量,不能再次赋值的。