一、指针函数:返回值是指针的函数
指针函数的核心是函数,返回值类型是一个指针。语法格式如下:
返回值类型* 函数名(参数列表);
关键注意点:
(1)不能返回函数内局部变量的地址,因为局部变量在函数执行完毕后会被销毁。
(2)可以返回全局变量、静态局部变量或堆内存(malloc 分配)的地址。
代码示例:
#include <stdio.h>
#include <stdlib.h>
int* createArray(int n) {
int* arr = (int*)malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
arr[i] = i * 2;
}
return arr;
}
int main() {
int* p = createArray(5);
for (int i = 0; i < 5; i++) {
printf("%d ", p[i]);
}
free(p);
return 0;
}
二、函数指针:指向函数的指针
函数指针的核心是指针,指向函数的入口地址。语法格式如下:
返回值类型 (*指针变量名)(参数列表);
核心用途:
(1)实现函数回调(如 qsort 排序)。
(2)模拟多态行为。
(3)简化函数调用接口。
代码示例:
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int mul(int a, int b) {
return a * b;
}
int main() {
int (*funcPtr)(int, int);
funcPtr = add;
printf("3+5=%d\n", funcPtr(3, 5));
funcPtr = mul;
printf("3*5=%d\n", (*funcPtr)(3, 5));
return 0;
}
三、二级指针:指向指针的指针
二级指针指向一级指针变量的内存地址。语法格式如下:
数据类型** 二级指针名;
核心用途:
(1)在函数中修改一级指针的值。
(2)处理指针数组(如字符串数组 char* arr[])。
代码示例:
#include <stdio.h>
void assignValue(int** pp) {
*pp = (int*)malloc(sizeof(int));
**pp = 100;
}
int main() {
int* p = NULL;
int** pp = &p;
assignValue(pp);
printf("p指向的值:%d\n", *p);
printf("p的地址:%p\n", p);
printf("pp存储的地址(即p的地址):%p\n", pp);
free(p);
return 0;
}
四、const 指针:限制指针或指向内容的修改
const 修饰指针时,区分修饰指针本身还是指向的内容。
1、修饰指向的内容(内容不可改)
const int* p;
(1)不能通过指针修改目标变量的值。
(2)指针本身可以重新指向其他变量。
2、修饰指针本身(指针不可改)
int* const p = &a;
1、指针本身不能重新指向其他变量。
2、可以通过指针修改目标变量的值。
3、必须初始化。
3、同时修饰指针和内容(都不可改)
const int* const p = &a;
1、指针和指向的内容均不可修改。
2、必须初始化。
总结
| 概念 | 本质 | 语法格式 | 核心用途 |
|---|---|---|---|
| 指针函数 | 函数 | 返回值类型* 函数名(参数) | 返回指针(如堆内存地址) |
| 函数指针 | 指针 | 返回值 (*指针名)(参数) | 函数回调、模拟多态 |
| 二级指针 | 指针 | 数据类型** 指针名 | 修改一级指针、处理指针数组 |
| const 指针 | 指针 | 根据 const 位置决定限制对象 | 保护数据或指针不被意外修改 |
1086

被折叠的 条评论
为什么被折叠?



