云计算百科
云计算领域专业知识百科平台

linux基础,c语言进阶,指针篇(中)

上一篇中,简单讲解了指针的基础,这篇主要,补充字符型数组和字符串作为函数传参,函数指针和指针函数,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:都不可以修改,必须初始化

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » linux基础,c语言进阶,指针篇(中)
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!