上一篇中,简单讲解了指针的基础,这篇主要,补充字符型数组和字符串作为函数传参,函数指针和指针函数,const指针。
注意:指针用来操作数据,数组用来存储数据。
字符型数组和字符串作为函数传参
在C语言中,字符串本质上是字符数组,以空字符\\0结尾。当我们将字符串传递给函数时,实际上传递的是数组首元素的地址(即指针)。
关键知识点
数组退化为指针:函数参数中的字符数组会退化为char*类型
两种传递方式:
-
传递字符数组名(隐式转换为指针)
-
显式声明为char[](实际仍是按指针处理)
字符串的遍历模板(指针篇)
char *p = NULL;//代码框架
p = str;
while(*p != '\\0')
{
p++;
}
函数指针
函数返回值为指针的函数,又说返回指针的函数,本质是函数非指针.
不能返回局部变量的地址
函数返回值作为下一个调用函数参数时,可以使用指针函数
声明:
返回类型* 函数名(参数列表);
// 返回整型指针的函数
int* createIntArray(size_t size) {
int *arr = malloc(size * sizeof(int));
for (size_t i = 0; i < size; i++) {
arr[i] = (int)i;
}
return arr;
}
// 使用示例
int *myArray = createIntArray(5);
NSLog(@"%d", myArray[2]); // 输出2
free(myArray); // 记得释放内存
指针函数
函数指针是指针,指向函数的指针变量,存储函数的入口地址,
函数名就是指向该函数的指针
声明:
返回类型 (*指针变量名)(参数类型1 ……)
// 普通函数
int add(int a, int b) {
return a + b;
}
// 函数指针声明
int (*mathFuncPtr)(int, int) = add;
// 使用函数指针调用
int result = mathFuncPtr(3, 5); // 结果为8
函数指针和指针函数对比
对比表格
|
本质 |
指针变量 |
函数 |
|
存储内容 |
函数入口地址 |
返回指针值 |
|
声明方式 |
int (*ptr)(int, int) |
int* func(int, int) |
|
主要用途 |
回调函数/动态调用 |
返回动态分配的内存 |
|
调用方式 |
(*ptr)(args)或 ptr(args) |
直接调用函数 |
const指针
我们需要抓住核心:const关键字用于限制指针的“可修改性”——它可以限制“指针指向的数据”,也可以限制“指针本身”,或同时限制两者。由于const的位置不同,含义差异很大,这是初学者最容易混淆的点。
本文用“门牌号”类比指针(指针=门牌号,指向的地址=房子位置,指向的数据=房子里的内容)。
核心概念:const指针的两种限制对象
const指针的本质是“带限制的指针”,限制的对象有两种:
限制“指向的数据”:指针指向的内容不可修改(但指针本身可以改,即可以换“门牌号”指向别的房子);
限制“指针本身”:指针的“门牌号”不可修改(即固定指向某个房子,但房子里的内容可以改)。
根据限制对象的不同,const指针分为4种常见类型(后两种是前两种的组合)。
总结表格(一目了然)
|
指向常量的指针 |
const int* p |
✅ 可改 |
❌ 不可改 |
可不初始化 |
|
(同上) |
int const* p |
✅ 可改 |
❌ 不可改 |
可不初始化 |
|
常量指针 |
int* const p |
❌ 不可改 |
✅ 可改 |
必须初始化 |
|
指向常量的常量指针 |
const int* const p或 int const *const p; |
❌ 不可改 |
❌ 不可改 |
必须初始化 |
上述表格分成3个形式
形式1:指针本身可以修改,指针指向空间的数据不能改变
形式2:指针本身不可以改变,指针指向空间是数据可以改变,简单来说就是,指针指向固定空间,且可以修改相关的值,必须初始化
形式3:都不可以修改,必须初始化
网硕互联帮助中心





评论前必须登录!
注册