跳到主要内容

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;
}
代码
正在准备编辑器…
运行结果