Z
ZHANK
指针

指针基础与取址

理解地址、& 取址、* 解引用、指针变量声明

指针基础与取址

指针是 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)