二、常量指针与指针常量

一、常量指针:又叫常指针,可以理解为常量的指针,即也是指针,指向的是个常量(指向的对象是常量)。指针变量可以修改, 但是不能通过指针来修改其指向的对象。

代码形式:

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);

 

posted @ 2024-06-30 21:41  秋雨无痕  阅读(54)  评论(0)    收藏  举报