常量指针和指针常量
1
2
int i = 10;
int* p = &i;

指针是用来存储地址的,我们用指针 p 指向一个变量 i ,即存储该变量的地址。其中 & 意味着取地址符,* 意味着解引用。所以,当我们想要获取变量 i 存储的实际数据,可以选择直接输出 变量 i ,或者选择 *p 解引用来获取变量 i 存储的实际数据。两个的区别就是,变量 i 直接访问到内存,而 *p 需要先读取到 指针 p 指向的内存,然后再访问内存。因此,我们讲 变量 i 是直接访问,指针 p 是间接访问。

你要知道 p 等价于 变量 i 的内存地址,*p 就等于于 i。

指针.png

此刻的指针 p 对指向的内存有读和写的权限,即读取指向内存的数据和修改指向内存的数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

int i = 10;
int* p = &i;
printf("p = %d\n", *p);
*p = 20;
printf("p = %d\n", *p);

return 0;
}

输出结果:

1
2
p = 10
p = 20

常量指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main(void) {

int i = 10;
int j = 20;
const int* p = &i;

printf("p = %d\n", p);

p = &j;

*p = 10; // 报错

printf("p = %d\n", *p);

return 0;
}

从左往右看,常量(const)+ 指针(*)。

从报错情况来看,*p 对于指向内存的数据有读的权限,但是没有写的权限。p对于指向内存的数据有读的权限,也有写的权限。即常量指针能改变所指的对象,但是不可以改变所指对象的数据。

常量指针.png

指针常量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main(void) {

int i = 10;
int j = 20;
int* const p = &i;

printf("p = %d\n", p);

p = &j; // 报错

*p = 10;

printf("p = %d\n", *p);

return 0;
}

从左往右看,指针(*)+ 常量(const)。

从报错情况来看,*p 对于指向内存的数据有读的权限,也有写的权限。p对于指向内存的数据有读的权限,但是没有写的权限。即常量指针不能改变所指的对象,但是可以改变所指对象的数据。

指针常量.png

常量指针常量

const int* const 变量名。不必多说,既不能修改所指的对象,还不可以修改所指对象的数据。