指针基础与取址
理解地址、& 取址、* 解引用、指针变量声明
指针基础与取址
指针是 C 语言的灵魂。 不理解指针就等于没学会 C。但指针本质上很简单——它就是一个存地址的变量。
学完本章你将: 理解地址概念、& 取地址、* 解引用、指针变量声明。
什么是地址
c
#include <stdio.h>
int main() {
int x = 42;
printf("x 的值: %d\n", x); // 42
printf("x 的地址: %p\n", &x); // 如 0x7fff5fbff83c
return 0;
}
内存就像一个巨大的数组,每个字节有一个地址。&x 就是 x 在内存中的"门牌号"。
& 和 * —— 指针的两个运算符
c
int x = 42;
int *p = &x; // p 存的是 x 的地址
// int * 表示"指向 int 的指针"
printf("%p\n", p); // x 的地址
printf("%d\n", *p); // 42(解引用:通过地址拿到值)
*p = 100; // 通过指针修改 x
printf("%d\n", x); // 100
| 运算符 | 含义 |
|---|---|
| & | 取地址 |
| * | 解引用(通过地址访问值) |
指针的声明
c
int *p; // p 是指向 int 的指针
char *c; // c 是指向 char 的指针
void *v; // 可以指向任何类型,但不能解引用
// 多指针声明注意!
int *a, *b; // ✅ a 和 b 都是指针
int* a, b; // ❌ a 是指针,但 b 是 int!
// 建议一行一个
int *a;
int *b;
⚠️
int* a, b;这个写法非常具有迷惑性——只有 a 是指针,b 是普通 int。永远一行只声明一个指针。
NULL 指针
c
int *p = NULL; // 空指针,不指向任何地址
if (p == NULL) {
printf("指针为空,不能解引用\n");
}
// *p = 10; // ❌ 对 NULL 解引用 → 段错误(Segmentation Fault)