指针基础

指针和指针变量

指针是地址,指针变量是存储地址的变量。

如下图为,指针变量 p 指向 变量 i 的地址。

指针1.png

取地址运算符和间接寻址运算符

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

int num = 10;

int* p; // 声明一个指针变量

p = # // 指向变量 num 的地址

printf("p = %d", *p); // 对指针变量 p 解引用,即获取 指针变量 p 指向地址的数据

return 0;
}

& 获取变量的地址,* 对指针变量解引用。

你可以看到 & 和 * 是互相抵消的关系,如上述代码中*p = *&num = num

只要 p 指向 num,p 就是 num 的别名。p 不仅拥有和 num 相同的值,而且对 p 的改变也会改变 num 的值。(p 是左值,所以对它赋值是合法的。)

指针赋值

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

int num1 = 10;
int num2 = 20;

int* p = &num1;
int* m = &num2;

p = m;

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

*p = *m;

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

return 0;
}

两个指针,对于不同的赋值方式含义也是不同的。

p = m 是指针赋值,即 指针变量p 原来指向变量 num1的地址,现在和 指针变量m 一起指向 变量 num2。

指针2.png

*p = *m 是把 m 指向的值(num2 的值)复制到 p 指向的对象(变量num1)中。

指针3.png

至此,我们可以说改变 变量的值有两种方式,一个是修改所指向的对象,一个是修改所指向的对象存储的值。切记弄清楚两种赋值方式的区别。