419 字
1 分钟
【C】指针基础
2026-05-19

什么是指针#

指针是存放地址的变量,其值为另一个对象(或函数)的地址。

int num = 10;
int *p = # // p 的类型是 int*,存 num 的地址
  • int *p 读作:p 是指向 int 的指针
  • *p 是解引用,表示 p 所指向的 int 对象

指针长度#

指针本身大小取决于寻址位数,与所指类型无关:

平台指针典型大小可寻址空间
32 位4 字节约 4 GB
64 位8 字节理论 2⁶⁴

基本操作#

取地址 &#

int num = 10;
int *p = #

解引用 *#

printf("%d\n", *p); // 10
*p = 20; // 修改 num

解引用前须保证指针已初始化且指向有效、有生命周期的对象。

指针算术#

int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr; // 指向 arr[0]
ptr++; // 指向下一个 int,地址 + sizeof(int)
ptr += 2;

指针加减的单位是所指类型的大小

空指针与野指针#

空指针 NULL#

int *p = NULL;
if (p != NULL) {
*p = 1;
}

不指向任何对象;用于表示「无效」或「未赋值」,避免误用随机地址。

野指针#

  • 未初始化的指针
  • 指向已释放内存的指针(悬空指针)
  • 指向已失效的局部变量

对野指针解引用可能导致段错误或未定义行为。

指针与数组#

数组名退化#

在表达式中,数组名通常转为指向首元素的指针:

int a[5];
a == &a[0]; // 非 0(地址相同)

例外:

  • sizeof(a):整个数组大小
  • &a:类型为 int (*)[5],指向整个数组

数组指针#

指向整个数组的指针:

int a[5];
int (*ap)[5] = &a;

ap + 1 跳过整个数组(+20 字节,假设 int 为 4 字节)。

指针数组#

元素是指针的数组:

int x = 10, y = 20, z = 30;
int *parr[3] = {&x, &y, &z};

parr 是数组,parr[i]int**parr[1] 为 20。

声明含义
int *p[5]指针数组:5 个 int*
int (*p)[5]数组指针:指向含 5 个 int 的数组

复杂声明可用 10-右左定则 解析。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

【C】指针基础
https://lysj.work/posts/studynotes/c/c指针基础/
作者
Sekiro
发布于
2026-05-19
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录