316 字
1 分钟
【C】指针进阶
复杂声明建议配合 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-函数。
分享
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时
相关文章 智能推荐
