抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

Kelecn

“唯爱与科技不可辜负!”

简介:常量指针与指针常量的区别。

常量指针(被指向的对象是常量)

定义:

又叫常指针,可以理解为常量的指针,指向的是个常量

关键点:

  1. 常量指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改;
  2. 常量指针可以被赋值为变量的地址,之所以叫常量指针,是限制了通过这个指针修改变量的值;
  3. 指针还可以指向别处,因为指针本身只是个变量,可以指向任意地址; 

代码形式:

1
int const* p;  const int* p;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>

// 常量指针(被指向的对象是常量)
int main() {
int i = 10;
int i2 = 11;
const int *p = &i;
printf("%d\n", *p);//10
i = 9; //OK,仍然可以通过原来的声明修改值,
//Error,*p是const int的,不可修改,即常量指针不可修改其指向地址
//*p = 11; //error: assignment of read-only location ‘*p’
p = &i2;//OK,指针还可以指向别处,因为指针只是个变量,可以随意指向;
printf("%d\n", *p);//11
return 0;
}

指针常量(指针本身是常量)

定义:

本质是一个常量,而用指针修饰它。指针常量的值是指针,这个值因为是常量,所以不能被赋值。

关键点:

  1. 它是个常量!
  2. 指针所保存的地址可以改变,然而指针所指向的值却不可以改变;
  3. 指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化;

代码形式:

1
int* const p;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//指针常量(指针本身是常量)
#include <stdio.h>

int main() {
int i = 10;
int *const p = &i;
printf("%d\n", *p);//10
//Error,因为p是const 指针,因此不能改变p指向的内容
//p++;//error: increment of read-only variable ‘p’
(*p)++; //OK,指针是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化
printf("%d\n", *p);//11
i = 9;//OK,仍然可以通过原来的声明修改值,
return 0;
}

如何区分常量指针和指针常量

  • 一种方式是看 * 和 const 的排列顺序,比如
1
2
3
int const* p;	//const * 即常量指针
const int* p; //const * 即常量指针
int* const p; //* const 即指针常量
  • 还一种方式是看const离谁近,即从右往左看,比如
1
2
3
int const* p;	//const修饰的是*p,即*p的内容不可通过p改变,但p不是const,p可以修改,*p不可修改;
const int* p; //同上
int* const p; //const修饰的是p,p是指针,p指向的地址不能修改,p不能修改,但*p可以修改;

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//结构体类型的定义
struct stu
{
char name[50];
int age;
};

void fun1(struct stu * const p)
{
//p = NULL; //err
p->age = 10; //ok
}

//void fun2(struct stu const* p)
void fun2(const struct stu * p)
{
p = NULL; //ok
//p->age = 10; //err
}

void fun3(const struct stu * const p)
{
//p = NULL; //err
//p->age = 10; //err
}

评论




博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议

总访问量为 访客数为

粤ICP备2021157327号

载入天数...载入时分秒...