一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

函數(shù)指針的六個(gè)常見應(yīng)用場景

信盈達(dá) ? 2025-04-07 11:58 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

函數(shù)指針在嵌入式開發(fā)中有著廣泛的應(yīng)用,它讓代碼更加靈活,減少冗余,提高可擴(kuò)展性。很多時(shí)候,我們需要根據(jù)不同的情況動(dòng)態(tài)調(diào)用不同的函數(shù),而函數(shù)指針正是實(shí)現(xiàn)這一需求的重要工具。本文將介紹六個(gè)常見的函數(shù)指針應(yīng)用場景,并結(jié)合示例代碼進(jìn)行講解。



01、回調(diào)函數(shù):解耦代碼,提高靈活性

回調(diào)函數(shù)是嵌入式開發(fā)中最常見的函數(shù)指針應(yīng)用場景之一。它允許我們?cè)诤瘮?shù)執(zhí)行過程中,動(dòng)態(tài)調(diào)用用戶定義的函數(shù),從而提高代碼的靈活性。


示例:事件觸發(fā)時(shí)執(zhí)行回調(diào)函數(shù)

#include


void handle_event(int event_type, void (*callback)(void)) {

printf("Event %d occurred\n", event_type);

if (callback) {

callback();

}

}


void callback_function() {

printf("Callback function executed!\n");

}


int main() {

handle_event(1, callback_function); // 觸發(fā)事件1,執(zhí)行回調(diào)函數(shù)

handle_event(2, NULL); // 觸發(fā)事件2,但沒有回調(diào)函數(shù)

return 0;

}



在這個(gè)例子中,handle_event函數(shù)會(huì)在事件觸發(fā)時(shí)調(diào)用callback_function,如果沒有注冊(cè)回調(diào)函數(shù),就不會(huì)執(zhí)行額外操作。

02、函數(shù)參數(shù)化:讓代碼更加通用有時(shí),我們希望讓一個(gè)函數(shù)的行為可變,而不是寫死某種邏輯。通過函數(shù)指針,我們可以在調(diào)用函數(shù)時(shí)動(dòng)態(tài)指定不同的處理邏輯,從而提高代碼的復(fù)用性。

示例:對(duì)數(shù)組元素執(zhí)行不同的操作

#include


void process_array(int *array, size_t size, int (*process)(int)) {

for (size_t i = 0; i < size; i++) {

array[i] = process(array[i]);

}

}


int increment(int n) { return n + 1; }


int square(int n) { return n * n; }


int main() {

int array[] = {1, 2, 3, 4, 5};

size_t size = sizeof(array) / sizeof(int);


process_array(array, size, increment); // 對(duì)數(shù)組執(zhí)行加1操作

process_array(array, size, square); // 對(duì)數(shù)組執(zhí)行平方操作


for (size_t i = 0; i < size; i++) {

printf("%d ", array[i]);

}

printf("\n");


return 0;

}

通過process_array函數(shù),我們可以選擇對(duì)數(shù)組執(zhí)行incrementsquare處理,而不需要寫兩個(gè)不同的函數(shù)。

03、排序算法:自定義比較規(guī)則

排序是函數(shù)指針的典型應(yīng)用場景,qsort 之所以強(qiáng)大,就在于它可以接收不同的比較函數(shù),從而支持各種排序需求。


示例:升序和降序排序

#include

#include


int compare_asc(const void *a, const void *b) {

return (*(int*)a - *(int*)b);

}


int compare_desc(const void *a, const void *b) {

return (*(int*)b - *(int*)a);

}


void print_array(int *array, size_t size) {

for (size_t i = 0; i < size; i++) {

printf("%d ", array[i]);

}

printf("\n");

}


int main() {

int array[] = {3, 1, 4, 1, 5, 9, 2, 6};

size_t size = sizeof(array) / sizeof(int);


qsort(array, size, sizeof(int), compare_asc);

print_array(array, size);


qsort(array, size, sizeof(int), compare_desc);

print_array(array, size);


return 0;

}

這里通過compare_asccompare_descqsort可以根據(jù)傳入的函數(shù)指針進(jìn)行升序或降序排序。

04、函數(shù)指針數(shù)組:高效選擇不同操作
當(dāng)我們需要根據(jù)不同的輸入執(zhí)行不同的函數(shù)時(shí),函數(shù)指針數(shù)組可以讓代碼更加緊湊、可維護(hù)。


示例:使用函數(shù)指針數(shù)組實(shí)現(xiàn)基本計(jì)算

#include


void add(int a, int b) { printf("%d + %d = %d\n", a, b, a + b); }

void subtract(int a, int b) { printf("%d - %d = %d\n", a, b, a - b); }

void multiply(int a, int b) { printf("%d * %d = %d\n", a, b, a * b); }

void divide(int a, int b) {

if (b != 0) printf("%d / %d = %d\n", a, b, a / b);

else printf("Cannot divide by zero\n");

}


int main() {

void (*operations[])(int, int) = {add, subtract, multiply, divide};

int a = 10, b = 5;

for (int i = 0; i < 4; i++) {

operations[i](a, b);

}

return 0;

}

這種方法可以避免冗長的switch-case語句,讓代碼更加整潔。


05、回溯法:靈活控制遞歸流程

在回溯算法中,我們經(jīng)常需要在不同的狀態(tài)下執(zhí)行不同的操作,函數(shù)指針可以幫助我們做到這一點(diǎn)。


示例:使用回溯法求數(shù)組全排列

#include


void swap(int *a, int *b) {

int tmp = *a;

*a = *b;

*b = tmp;

}


void permute(int *nums, size_t len, size_t depth, void (*callback)(const int *, size_t)) {

if (depth == len) {

callback(nums, len);

return;

}

for (size_t i = depth; i < len; i++) {

swap(&nums[depth], &nums[i]);

permute(nums, len, depth + 1, callback);

swap(&nums[depth], &nums[i]);

}

}


void print_permutation(const int *arr, size_t len) {

for (size_t i = 0; i < len; i++) {

printf("%d ", arr[i]);

}

printf("\n");

}


int main() {

int nums[] = {1, 2, 3};

permute(nums, 3, 0, print_permutation);

return 0;

}

這里的permute通過函數(shù)指針callback來決定如何處理排列結(jié)果。



06、多態(tài):模擬面向?qū)ο?a href="http://www.www27dydycom.cn/v/tag/1315/" target="_blank">編程

C語言中,我們可以通過函數(shù)指針模擬面向?qū)ο蟮亩鄳B(tài)特性。


示例:實(shí)現(xiàn)“類”的行為

#include


typedef struct {

void (*draw)(void);

} Shape;


void draw_circle() { printf("Drawing a circle\n"); }

void draw_rectangle() { printf("Drawing a rectangle\n"); }


int main() {

Shape circle = {draw_circle};

Shape rectangle = {draw_rectangle};


circle.draw();

rectangle.draw();


return 0;

}


這種方式讓Shape結(jié)構(gòu)體可以在不修改代碼的情況下支持新的圖形類型。


函數(shù)指針是C語言中的強(qiáng)大工具,在嵌入式開發(fā)中尤為常見。通過回調(diào)函數(shù)、參數(shù)化函數(shù)、排序算法、函數(shù)指針數(shù)組、回溯法和多態(tài),我們可以讓代碼更加靈活、結(jié)構(gòu)更加清晰。掌握這些用法,能讓你寫出更加高效和可擴(kuò)展的嵌入式代碼。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式開發(fā)
    +關(guān)注

    關(guān)注

    18

    文章

    1075

    瀏覽量

    48707
  • 函數(shù)指針
    +關(guān)注

    關(guān)注

    2

    文章

    57

    瀏覽量

    3955
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    函數(shù)指針的使用簡述

    函數(shù)指針在Linux內(nèi)核和C語言開發(fā)中用的非常多,而且在設(shè)計(jì)操作系統(tǒng)的時(shí)候也會(huì)用到,因此這里將詳細(xì)講解函數(shù)指針。既然函數(shù)
    的頭像 發(fā)表于 09-09 08:56 ?2245次閱讀
    <b class='flag-5'>函數(shù)</b><b class='flag-5'>指針</b>的使用簡述

    函數(shù)指針指針函數(shù)的概念

    不少朋友會(huì)混淆“函數(shù)指針”和“指針函數(shù)”這兩個(gè)概念,本文詳細(xì)介紹一下。
    發(fā)表于 03-09 10:49 ?1424次閱讀

    藍(lán)牙低功耗常見的應(yīng)用場景及架構(gòu)

    淺談藍(lán)牙低功耗(BLE)的幾種常見的應(yīng)用場景及架構(gòu)
    發(fā)表于 06-15 09:51

    消息隊(duì)列的5個(gè)常見應(yīng)用場景

    消息隊(duì)列的5個(gè)常見應(yīng)用場景https://segmentfault.com/a/1190000017130224想要在單片機(jī)開發(fā)應(yīng)用消息隊(duì)列處理事件主要是為了解耦,減少模塊與模塊之間的耦合??催^挺
    發(fā)表于 11-22 06:22

    六個(gè)電視游戲電路

    六個(gè)電視游戲電路
    發(fā)表于 01-17 22:52 ?812次閱讀
    <b class='flag-5'>六個(gè)</b>電視游戲電路

    c語言函數(shù)指針定義,指針函數(shù)函數(shù)指針的區(qū)別

     往往,我們一提到指針函數(shù)函數(shù)指針的時(shí)候,就有很多人弄不懂。下面就由小編詳細(xì)為大家介紹C語言中函數(shù)指針
    發(fā)表于 11-16 15:18 ?3857次閱讀

    理解函數(shù)指針、函數(shù)指針數(shù)組、函數(shù)指針數(shù)組的指針

    理解函數(shù)指針、函數(shù)指針數(shù)組、函數(shù)指針數(shù)組的指針
    的頭像 發(fā)表于 06-29 15:38 ?1.5w次閱讀
    理解<b class='flag-5'>函數(shù)</b><b class='flag-5'>指針</b>、<b class='flag-5'>函數(shù)</b><b class='flag-5'>指針</b>數(shù)組、<b class='flag-5'>函數(shù)</b><b class='flag-5'>指針</b>數(shù)組的<b class='flag-5'>指針</b>

    指針進(jìn)階第五站:函數(shù)指針!

    定義一個(gè)函數(shù)指針,指向的函數(shù)有兩個(gè)int形參并且返回一個(gè)函數(shù)
    發(fā)表于 08-17 15:58 ?655次閱讀

    如何使用函數(shù)指針

    在程序中定義一個(gè)函數(shù),則編譯時(shí)系統(tǒng)就會(huì)為這段代碼分配一段存儲(chǔ)空間,這段存儲(chǔ)空間的首地址稱為函數(shù)的地址,且函數(shù)名代表的就是這個(gè)地址。既然是地址就可以使用一
    的頭像 發(fā)表于 03-30 15:09 ?1076次閱讀

    函數(shù)指針的基本概念和語法

    函數(shù)指針是一種非常強(qiáng)大的編程工具,它可以讓我們以更加靈活的方式編寫程序。在本文中,我們將介紹 6 個(gè)函數(shù)指針的高級(jí)應(yīng)
    的頭像 發(fā)表于 07-05 10:32 ?800次閱讀

    函數(shù)指針的五大作用

    1,回調(diào)函數(shù)機(jī)制函數(shù)指針常用于實(shí)現(xiàn)回調(diào)函數(shù)。通過將函數(shù)指針作為參數(shù)傳遞給另一
    的頭像 發(fā)表于 12-06 08:00 ?2264次閱讀
    <b class='flag-5'>函數(shù)</b><b class='flag-5'>指針</b>的五大作用

    函數(shù)指針的基本概念和語法

    函數(shù)指針是一種非常強(qiáng)大的編程工具,它可以讓我們以更加靈活的方式編寫程序。在本文中,我們將介紹 8 個(gè)函數(shù)指針的高級(jí)應(yīng)
    的頭像 發(fā)表于 12-12 09:33 ?686次閱讀

    函數(shù)指針指針函數(shù)是不是一個(gè)東西?

    函數(shù)指針的本質(zhì)是指針,就跟整型指針、字符指針一樣,函數(shù)指針
    的頭像 發(fā)表于 01-03 16:35 ?742次閱讀
    <b class='flag-5'>函數(shù)</b><b class='flag-5'>指針</b>和<b class='flag-5'>指針</b><b class='flag-5'>函數(shù)</b>是不是一<b class='flag-5'>個(gè)</b>東西?

    C語言函數(shù)指針大應(yīng)用場景詳解

    函數(shù)指針是一種非常強(qiáng)大的編程工具,它可以讓我們以更加靈活的方式編寫程序。在本文中,我們將介紹 6 個(gè)函數(shù)指針的高級(jí)應(yīng)
    的頭像 發(fā)表于 04-23 18:19 ?1375次閱讀

    面試???1:函數(shù)指針指針函數(shù)、數(shù)組指針指針數(shù)組

    在嵌入式開發(fā)領(lǐng)域,函數(shù)指針、指針函數(shù)、數(shù)組指針指針數(shù)組是一些非常重要但又容易混淆的概念。理解它
    的頭像 發(fā)表于 08-10 08:11 ?1408次閱讀
    面試???1:<b class='flag-5'>函數(shù)</b><b class='flag-5'>指針</b>與<b class='flag-5'>指針</b><b class='flag-5'>函數(shù)</b>、數(shù)組<b class='flag-5'>指針</b>與<b class='flag-5'>指針</b>數(shù)組