避免野指针:指针一定要初始化指向「某一内存地址 || NULL」

指针与 const

image-20211119210133602

image-20211119212005088

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
26
27
28
29
// 如果指针是 const,表示一旦得到某个变量的地址,就不能再指向其他变量

int a = 123;

int * const ptr = &a;

*ptr = 456; // --------> Ok~

printf("%d\n", a);

ptr++; // -------------> Error !

------

// 如果所指的是 const,表示不能通过该指针去修改那个变量,但是指针的指向可改变

int a = 123;

const int * ptr = &a;

a = 456; // ------------> Ok~

*ptr = 456; // ---------> Error !

------

int b = 999;

ptr = &b;// ------------> Ok~

可将数组名理解为指向不能变的指针

1
2
3
int arr[] = { 1, 2, 3 };
int * ptr = NULL; arr = ptr;
// 可将数组名理解为指向不能变的指针,本代码报错:assignment to expression with array type

for more information, see here

必须初始化赋值的情况

1
2
const int arr[] = { 1, 2, 3 };
// 每个数组元素都是 const 的 int,必须初始化赋值

函数的形参加 const 代表一种 「承诺」

eg:承诺你传进来一个指针,我这个函数绝对不会修改这个指针所指向的内容

1
2
3
4
5
6
7
void f(const int * a) { ... }

int a = 10;
f(&a); // -------------> Ok~

const int b = 20;
f(&a); // -------------> Ok~

const 可保护数组的值

image-20211119213852579

(完)