一、常量指针:又叫常指针,可以理解为常量的指针,即也是指针,指向的是个常量(指向的对象是常量)。指针变量可以修改, 但是不能通过指针来修改其指向的对象。
代码形式:
int const* p; const int* p;
举例:
1 #include<stdio.h> 2 3 int main() 4 { 5 int a = 10; 6 const int *p; 7 p = &a; 8 *p = 12; 9 return 0; 10 }
第8行错误,错误信息:表达式必须是可修改的左值
编译报错:
.\const.c:8:8: error: assignment of read-only location '*p'
*p = 12;
但是p指向的地址是可修改的
1 #include<stdio.h> 2 3 int main() 4 { 5 int a = 10; 6 int b = 30; 7 const int *p; 8 p = &a; 9 p = &b; 10 return 0; 11 }
关键点:
1.常量指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改;
2.常量指针可以被赋值为变量的地址,之所以叫常量指针,是限制了通过这个指针修改变量的值;
3.指针还可以指向别处,因为指针本身只是个变量,可以指向任意地址;
二、指针常量:指针本身是个常量,不能再指向其他对象。指针常量的值是指针,这个值因为是常量,所以不能被赋值。
代码形式:
int* const p;
举例:
1 #include<stdio.h> 2 3 int main() 4 { 5 int a = 10; 6 int b = 20; 7 int *const p = &a; 8 p = &b; 9 return 0; 10 }
第8行显示错误:表达式必须是可修改的左值
编译报错:
.\const.c:7:7: error: assignment of read-only variable 'p'
p = &a;
^
关键点:
1.它是个常量!
2.指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化;
三、区分
一种方式是看 * 和 const 的排列顺序,比如
int const* p; //const * 即常量指针 const int* p; //const * 即常量指针 int* const p; //* const 即指针常量
还一种方式是看const离谁近,即从右往左看,比如
int const* p; //const修饰的是*p,即*p的内容不可通过p改变,但p不是const,p可以修改,*p不可修改; const int* p; //同上 int* const p; //const修饰的是p,p是指针,p指向的地址不能修改,p不能修改,但*p可以修改;
四、应用
在实际应用中,常量指针要比指针常量用的多,比如常量指针经常用在函数传参中,以避免函数内部修改内容。
size_t strlen(const char* src); //常量指针,src的值不可改变; char a[] = "hello"; char b[] = "world"; size_t a1 = strlen(a); size_t b1 = strlen(b);
标签:const,常量,指向,int,修改,指针 From: https://www.cnblogs.com/sunyiping/p/18276940