05 指针 地址
存地址的变量叫做指针
1. 数值与地址

int count = 0;
printf("%d\n", count);
printf("%p\n", &count);
count 保存的数值是 10;
&count 就是存放这份数据的内存地址。
2. 指针变量

int count = 0;
int *p = &count;
-
变量count装着0,指针p指变量count的地址 -
int *表示它指向的内存空间是一个int类型的数据。
| 写法 | 表示什么 |
|---|---|
count | 变量里保存的整数 10 |
&count | 变量的地址 |
p | 指针里保存的地址,这里就是 &count |
*p | 找到 p 指向的位置,访问那里的整数 |
3. 指针传参

#include <stdio.h>
void init(int *p)
{
*p = 0;
}
int main(void)
{
int count = 10;
init(&count);
printf("%d\n", count);
return 0;
}
-
&count取出地址,交给参数p; -
*p = 0修改这个内存地址里的数据; -
回到
main,count就变成了 0,通过这样函数就能修改main里的变量
提示
指针要先指向有效的数据,才能使用 *p。只写 int *p; 就直接使用,或者访问空指针 NULL,都会出问题。
4. 指针与数组

int value[4] = {1, 3, 6, 9};
int *p = value;
printf("%d\n", *p); // 1
printf("%d\n", *(p + 1)); // 3
-
这里的
value表示首元素地址,等同于&value[0]。 -
p + 1向后移动一个元素,所以指向第二个数 20。
练习
用指针交换两个变量
补全 swap 函数,交换 main 中 x = 3 和 y = 8 的值。练习结束后,说明为什么调用时要写 &x 和 &y。
示例输出
x = 8, y = 3
提示
先用临时变量保存 *a,再把 *b 写入 *a,最后把临时变量写入 *b。
参考代码
main.c
#include <stdio.h>
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int main(void)
{
int x = 3;
int y = 8;
swap(&x, &y);
printf("x = %d, y = %d\n", x, y);
return 0;
}