419 字
1 分钟
【C】指针基础
什么是指针
指针是存放地址的变量,其值为另一个对象(或函数)的地址。
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-右左定则 解析。
分享
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时
相关文章 智能推荐
