加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
    • 一、指针函数与函数指针
    • 二、指针数组与数组指针
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

面试常考+1:函数指针与指针函数、数组指针与指针数组~

08/12 11:40
558
阅读需 7 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

嵌入式开发领域,函数指针、指针函数、数组指针和指针数组是一些非常重要但又容易混淆的概念。理解它们的特性和应用场景,对于提升嵌入式程序的效率和质量至关重要。

一、指针函数与函数指针

指针函数:

定义:指针函数是指返回值为指针的函数。

语法:返回值类型 *函数名(参数列表)。

示例代码:

#include <stdio.h>#include <stdlib.h>
int *getNumber(int a, int b) {    int *result = (int *)malloc(sizeof(int));    *result = a + b;    return result;}
int main() {    int *sum = getNumber(3, 4);    printf("Sum: %dn", *sum);    free(sum);    return 0;}

应用场景:

通常用于动态内存分配的场景。比如在嵌入式系统中,需要根据不同的条件动态分配内存来存储数据时,可以使用指针函数。它可以根据输入的参数,在堆上分配合适大小的内存空间,并返回指向该空间的指针。

函数指针:

定义:函数指针是指向函数的指针变量。

语法:返回值类型 (*指针变量名)(参数列表)。

示例代码:

#include <stdio.h>
int add(int a, int b) {    return a + b;}
int subtract(int a, int b){    return a - b;}
int main() {    int (*funcPtr)(int, int);    funcPtr = add;    int result1 = funcPtr(5, 3);    printf("Addition result: %dn", result1);
    funcPtr = subtract;    int result2 = funcPtr(5, 3);    printf("Subtraction result: %dn", result2);    return 0;}

应用场景:

事件驱动系统:在嵌入式系统中,可能会有多个不同的事件源(如按键、传感器等),每个事件都对应一个处理函数。可以使用函数指针来根据不同的事件调用相应的处理函数,提高系统的灵活性和可扩展性。

回调函数:

当一个函数需要在特定的操作完成后执行另一个函数时,可以将另一个函数的指针作为参数传递给它。例如,在嵌入式网络通信中,当接收到数据后,调用一个预先定义的处理数据的回调函数。

二、指针数组与数组指针

指针数组

定义:指针数组是由指针组成的数组。

语法:数据类型 *数组名[数组大小]。

示例代码:

#include <stdio.h>
int main() {    char *strings[] = {"Hello", "World", "Embedded"};    for (int i = 0; i < 3; i++)    {        printf("%sn", strings[i]);    }    return 0;}

应用场景:

管理多个字符串:在嵌入式系统中,如果需要处理多个字符串,可以使用指针数组。每个指针指向一个字符串的首地址,这样可以方便地对多个字符串进行操作和管理。

动态配置不同数据类型的指针:在一些需要根据不同情况动态配置不同数据类型指针的场景下,指针数组可以发挥作用。比如根据不同的传感器类型,配置不同的指针来获取相应的数据。

数组指针:

定义:数组指针是指向数组的指针。

语法:数据类型 (*指针变量名)[数组大小]。

示例代码:

#include <stdio.h>
int main() {    int arr[3][3] = {            {1, 2, 3},            {4, 5, 6},            {7, 8, 9}    };    int (*arrayPtr)[3] = arr;    for (int i = 0; i < 3; i++) {        for (int j = 0; j < 3; j++) {            printf("%d ", (*arrayPtr)[j]);        }        arrayPtr++;        printf("n");    }    return 0;}

应用场景:

多维数组的参数传递:在嵌入式程序中,当需要将多维数组作为函数参数传递时,通常使用数组指针。这样可以避免数组在传递过程中的降维问题,确保函数能够正确访问多维数组的元素。

指向动态分配的二维数组:在动态内存分配的二维数组中,数组指针可以方便地管理和访问二维数组的元素。例如,在嵌入式图形处理中,动态分配一个二维像素数组,使用数组指针来操作该数组。

总之,在嵌入式开发中,正确理解和运用函数指针、指针函数、数组指针和指针数组,可以使程序更加灵活、高效和易于维护。通过掌握这些概念,开发者能够更好地应对各种复杂的嵌入式系统开发需求。

希望这篇文章能够帮助大家理清这些容易混淆的概念及其在嵌入式中的应用场景,让我们在嵌入式开发的道路上更进一步。

欢迎转发分享给需要的好友!

微信号:zls_it

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
HCPL-0601-500E 1 Broadcom Limited Logic IC Output Optocoupler, 1-Element, 3750V Isolation, 10MBps, ROHS COMPLIANT, SOIC-8
$3.05 查看
C3E-12.000-12-3030-X-R 1 Aker Technology Company Ltd Parallel - Fundamental Quartz Crystal, 12MHz Nom, SMD, 4 PIN
暂无数据 查看
AT17F16A-30CU 1 Atmel Corporation Configuration Memory, 16MX1, Serial, CMOS, 6 X 6 MM, 1.04 MM HEIGHT, 1.27 MM PITCH, GREEN, LAP-8
$29.47 查看

相关推荐

电子产业图谱

微信公众号《朱老师IT充电站》主笔。先后从事电子工程师、单片机软件工程师、嵌入式linux软件工程师、物联网软件工程师、架构师等工作,教育品牌<朱老师物联网大讲堂>创始人,畅销书作者。擅长U-Boot、linux kernel等嵌入式底层和系统层开发、架构设计。擅长汇编、C/C++、Java、C#等常用开发语言。被授予:IBM技术专家、华为云享专家、51CTO学院金牌讲师等称号。