316 字
1 分钟
【C】指针进阶
2026-05-19

复杂声明建议配合 10-右左定则 阅读。

指针的种类#

// 指向基本类型
int num = 10;
int *p_num = #
// 指向函数
int func1(void) { return 1; }
int func2(int x) { return x; }
int (*p_fun1)(void) = &func1;
int (*p_fun2)(int) = func2; // 函数名即入口地址,& 可省略
// 指向数组元素 / 整个数组
int array[5] = {1, 3, 5, 7, 9};
int *p_elem = array; // 指向 array[0]
int (*p_whole)[5] = &array; // 指向整个 array
// 指向结构体
struct Student {
int id;
char name[20];
};
struct Student stu = {1, "Tom"};
struct Student *p_stu = &stu;
p_stu->id = 2; // 等价于 (*p_stu).id
// 多级指针
int **pp = &p_num;

多级指针#

int num = 0;
int *p1 = #
int **p2 = &p1;
int ***p3 = &p2;

每多一级 *,多解引用一次才得到最终的 int

常量与指针#

指向常量的指针#

const int *p; // 或 int const *p;
  • 不能通过 p 修改所指 int
  • 可以p 指向别的 int

指针常量#

int *const p = #
  • 不能改变 p 的指向
  • 可以通过 p 修改所指 int

指向常量的指针常量#

const int *const p = &num1;

指向与所指对象都不可通过 p 改变。

写法俗称改指向改所指对象的值(通过指针)
const int *p指向常量的指针不能
int *const p指针常量不能
const int *const p两者都是不能不能

记忆const 默认修饰左边;左边没有则修饰右边(如 const int *p 修饰 *p)。

数组指针与指针数组(复习)#

int a[5] = {1, 2, 3, 4, 5};
int (*ap)[5] = &a; // 数组指针
int x = 10, y = 20;
int *parr[2] = {&x, &y}; // 指针数组

详见 08-指针基础

void 指针#

void*通用对象指针,可存放任意对象地址(函数指针除外,不能与对象指针互转规则见标准)。

void *vp = malloc(sizeof(int));
if (vp != NULL) {
int *ip = (int *)vp;
*ip = 42;
free(vp);
vp = NULL;
}
  • C 中 void*隐式转为其它对象指针类型;解引用前必须转为具体类型
  • C++ 中需显式转换
  • void 用于无返回值函数;void func(void) 表示无参数

函数指针与回调(复习)#

09-函数

分享

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

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

部分信息可能已经过时

目录