白骑士的C语言教学高级篇 3.1 高级指针技术

系列目录

上一篇:白骑士的C语言教学进阶篇 2.5 C标准库

        在C语言中,指针是一种强大的工具,它不仅可以用于基本的内存地址操作,还可以实现更高级的编程技术。了解和掌握高级指针技术,可以使程序更加灵活和高效。本节将介绍指针数组与数组指针、函数指针以及多重指针。

指针数组与数组指针

指针数组

        是一个数组,其中每个元素都是一个指针。指针数组通常用于存储一组字符串或动态分配的内存块,例如:

#include <stdio.h>


int main() {
    const char *fruits[] = {"Apple", "Banana", "Cherry"};

    for (int i = 0; i < 3; i++) {
        printf("%s\n", fruits[i]);
    }

    return 0;
}

        在上面的例子中,‘fruits‘ 是一个指向字符串的指针数组,每个元素都指向一个字符串常量。

数组指针

        是指向数组的指针。与指针数组不同,数组指针本身是一个指针,它指向一个数组的起始地址,例如:

#include <stdio.h>


int main() {
    int numbers[3] = {1, 2, 3};
    int (*ptr)[3] = &numbers;

    for (int i = 0; i < 3; i++) {
        printf("%d\n", (*ptr)[i]);
    }

    return 0;
}

        在上面的例子中,‘ptr‘是一个指向包含三个整数的数组的指针。

函数指针

函数指针

        是指向函数的指针,它允许程序通过指针调用函数。这在实现回调函数和动态函数调用时非常有用,例如:

#include <stdio.h>


int add(int a, int b) {
    return a + b;
}


int main() {
    int (*func_ptr)(int, int) = add;
    int result = func_ptr(2, 3);

    printf("Result: %d\n", result);

    return 0;
}

        在上面的例子中,‘func_ptr‘ 是一个指向函数‘add‘的指针,通过它可以调用 ‘add‘ 函数。

        函数指针的另一个常见用途是作为参数传递给另一个函数,例如在排序算法中传递比较函数:

#include <stdio.h>
#include <stdlib.h>


int compare(const void *a, const void *b) {
    return (*(int *)a - *(int *)b);
}


int main() {
    int numbers[] = {5, 2, 9, 1, 5, 6};

    size_t size = sizeof(numbers) / sizeof(numbers[0]);

    qsort(numbers, size, sizeof(int), compare);

    for (size_t i = 0; i < size; i++) {
        printf("%d ", numbers[i]);
    }

    printf("\n");

    return 0;
}

        在这个例子中,‘compare‘ 函数被作为参数传递给 ‘qsort‘ 函数,用于比较数组中的元素。

多重指针

        是指向指针的指针,它可以用于间接引用和动态多维数组。多重指针允许程序处理更复杂的结构,如链表、树和图。在上面的例子中,‘double_ptr‘ 是一个指向 ‘ptr‘ 的指针,通过它可以间接访问 ‘value‘。

        多重指针在动态分配二维数组时特别有用,例如:

#include <stdio.h>
#include <stdlib.h>


int main() {
    int rows = 3;
    int cols = 4;
    int **matrix = (int **)malloc(rows * sizeof(int *));

    for (int i = 0; i < rows; i++) {
        matrix[i] = (int *)malloc(cols * sizeof(int));
    }

    // 初始化矩阵
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            matrix[i][j] = i * cols + j;
        }
    }

    // 打印矩阵
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", matrix[i][j]);
        }

        printf("\n");
    }

    // 释放内存
    for (int i = 0; i < rows; i++) {
        free(matrix[i]);
    }

    free(matrix);

    return 0;
}

        在这个例子中,我们动态分配了一个二维数组,并使用多重指针进行访问和操作。

总结

        高级指针技术是C语言中非常重要的一部分,通过掌握指针数组与数组指针、函数指针和多重指针,可以编写更灵活和高效的程序。这些技术不仅可以提高代码的可读性和可维护性,还可以实现更复杂的数据结构和算法。在实际编程中,灵活运用这些技术,可以大大提升程序的性能和功能。

下一篇:白骑士的C语言教学高级篇 3.2 高级数据结构​​​​​​​

根据原作 https://pan.quark.cn/s/0ed355622f0f 的源码改编 野火IM解决方案 野火IM是专业级即时通讯和实时音视频整体解决方案,由北京野火无限网络科技有限公司维护和支持。 主要特性有:私有部署安全可靠,性能强大,功能齐全,全平台支持,开源率高,部署运维简单,二次开发友好,方便与第三方系统对接或者嵌入现有系统中。 详细情况请参考在线文档。 主要包括一下项目: 野火IM Vue Electron Demo,演示如何将野火IM的能力集成到Vue Electron项目。 前置说明 本项目所使用的是需要付费的,价格请参考费用详情 支持试用,具体请看试用说明 本项目默认只能连接到官方服务,购买或申请试用之后,替换,即可连到自行部署的服务 分支说明 :基于开发,是未来的开发重心 :基于开发,进入维护模式,不再开发新功能,鉴于已经终止支持且不再维护,建议客户升级到版本 环境依赖 mac系统 最新版本的Xcode nodejs v18.19.0 npm v10.2.3 python 2.7.x git npm install -g node-gyp@8.3.0 windows系统 nodejs v18.19.0 python 2.7.x git npm 6.14.15 npm install --global --vs2019 --production windows-build-tools 本步安装windows开发环境的安装内容较多,如果网络情况不好可能需要等较长时间,选择早上网络较好时安装是个好的选择 或参考手动安装 windows-build-tools进行安装 npm install -g node-gyp@8.3.0 linux系统 nodej...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白骑士所长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值