C語言之函數指針(持續更新)

C語言精髓是指針,指針知識深似海,遇到一些學習一些~


文章目錄

  • 1. typedef 定義函數指針類型
  • 2. void* 空指針的解引用

1. typedef 定義函數指針類型

函數參數化是指通過函數指針將函數的某些行為參數化。這樣,我們可以在調用函數時動態地指定函數的行為。以下是一個示例:

#include <stdio.h>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 * 2;
}int main()
{int array[] = {1, 2, 3, 4, 5};size_t size = sizeof(array) / sizeof(int);process_array(array, size, increment);for(size_t i =0; i < size; i++){printf("%d", array[i]);}printf("\n");return 0;
}

如果通過typedef來定義函數指針類型:

#include <stdio.h>typedef int (*process_t)(int);void process_array(int *array, size_t size, process_t process)
{for(size_t i = 0; i < size; i++){array[i] = process(array[i]);}
}int increment(int n)
{return n * 2;
}int main()
{int array[] = {1, 2, 3, 4, 5};size_t size = sizeof(array) / sizeof(int);process_array(array, size, increment);for(size_t i =0; i < size; i++){printf("%d", array[i]);}printf("\n");return 0;
}

定義的 process_array 函數接受三個參數:一個整型數組、數組大小、一個函數指針。函數指針指向一個函數,該函數接受一個整型參數并返回一個整型結果因此,當執行到 array[i] = process(array[i]); 時,process函數會自動調用increment函數。
有人可能會問了:“那如果我再定義一個函數:int aaaa(int x){return x + 1;}呢?process 函數會調用哪個函數?”。
這樣符合 process_t 類型的函數就有多個了,我們可以將 process 指針指向某個函數,比如:

process_t process = aaaa; // 設置 process 指針指向 aaaa 函數
process_array(array, size, process);

2. void* 空指針的解引用

首先定義一個uint32_t 類型的param_value ,其值為0xa5a5,現在已經通過某種方法將 param_value 的地址指針傳入了函數 sys_manager_handler 中(第三個參數),我們需要關注的是如何在函數內使用printf將 param_value 這個值打印出來。
在printf中,應該使用何種占位符?param作為一個指針又應該如何變換?
偽代碼如下:

uint32_t param_value = 0xa5a5;int sys_manager_handler(void *cobj, uint32_t event_id, void *param)
{printf("we got value from event:%lx", *(uint32_t *)param);printf("sys_manger got value from event:%lx", *param);
}

以上兩句 printf 哪個正確?
由于我們知道,傳入函數的第三個參數 param 是一個指向 param_value 地址的指針,所以我們在 printf 中的變量處需要對 param 指針進行解引用,得到一個 uint32_t 類型的變量,對應的占位符使用 %lx 就好啦。
但其實直接對 param 進行解引用是不對的,因為:

  • void * 類型的指針可以指向任何類型的數據,對應地,這樣的指針并沒有具體的類型信息,所以編譯器也不知道它指向的數據的類型和大小。
  • 當需要訪問void *指針所指向的數據時,必須先將其轉換為具體的指針類型,然后才能解引用。

綜上,正確的是第一句。

printf("we got value from event:%lx", *(uint32_t *)param);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/14720.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/14720.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/14720.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【每日刷題】Day48

【每日刷題】Day48 &#x1f955;個人主頁&#xff1a;開敲&#x1f349; &#x1f525;所屬專欄&#xff1a;每日刷題&#x1f34d; &#x1f33c;文章目錄&#x1f33c; 1. 872. 葉子相似的樹 - 力扣&#xff08;LeetCode&#xff09; 2. 114. 二叉樹展開為鏈表 - 力扣&…

react中怎么為props設置默認值

在React中&#xff0c;你可以使用ES6的類屬性&#xff08;class properties&#xff09;或者函數組件中的默認參數&#xff08;default parameters&#xff09;來定義props的默認值。 1.類組件中定義默認props 對于類組件&#xff0c;你可以在組件內部使用defaultProps屬性來…

如何撰寫EI會議的投稿信?

撰寫EI會議的投稿信&#xff08;Cover Letter&#xff09;是向會議組織者介紹你的論文和研究工作的一個重要環節。以下是撰寫投稿信的一些關鍵步驟和建議&#xff1a; 投稿信的結構 信頭 你的信息&#xff1a;包括姓名、職位、單位名稱、通訊地址、電子郵件和電話號碼。日期&am…

力扣652. 尋找重復的子樹

Problem: 652. 尋找重復的子樹 文章目錄 題目描述思路復雜度Code 題目描述 思路 1.利用二叉樹的后序遍歷將原始的二叉樹序列化&#xff08;之所以利用后序遍歷是因為其在歸的過程中是會攜帶左右子樹的節點信息,而這些節點信息正是該解法要利用的東西&#xff09;&#xff1b; 2…

js積累二(web頁面實現 時間走秒)

<tr><td class"ys04"><span class"ys02">當前時間&#xff1a;</span></td><td colspan"2"><span class"showTime"></span><script>var t null;t setTimeout(time, 1000); /…

【ai】chatgpt的plugin已經廢棄

發現找不到按鈕,原來是要申請: https://openai.com/index/chatgpt-plugins/ 發現申請已經跳轉了,好像是廢棄了? 不接受新插件了,但是openai的api 是可以繼續用的。 https://openai.com/waitlist/plugins/We are no longer accepting new Plugins, builders can now create…

Windows11的這個地方暴露著你的隱私,把它關掉避免尷尬

前言 現在的電腦真的是越來越智能化&#xff01;現在有很多小伙伴都是用著Windows11的吧&#xff01;用習慣了Windows11之后&#xff0c;突然發現它還是挺順手的。 但不知道你有沒有發現&#xff0c;Windows11上面有個地方暴露著你的隱私。這個隱私可能是某個小姐姐的圖片&am…

XSS---DOM破壞

文章目錄 前言一、pandas是什么&#xff1f;二、使用步驟 1.引入庫2.讀入數據總結 一.什么是DOM破壞 在HTML中&#xff0c;如果使用一些特定的屬性名&#xff08;如id或name&#xff09;給DOM元素命名&#xff0c;這些屬性會在全局作用域中創建同名的全局變量&#xff0c;指向對…

算法:最大連續子序列和

53. 最大子數組和 給你一個整數數組 nums &#xff0c;請你找出一個具有最大和的連續子數組&#xff08;子數組最少包含一個元素&#xff09;&#xff0c;返回其最大和。 子數組是數組中的一個連續部分。 class Solution:def maxSubArray(self, nums: List[int]) -> int:a…

Vue $nextTick作?是什么怎么使用

Vue中的$nextTick是一個非常重要的方法&#xff0c;主要用于在DOM更新后執行延遲回調。其工作原理基于Vue的異步更新隊列機制。 當你在Vue實例上修改數據后&#xff0c;Vue并不會立即更新DOM&#xff0c;而是將這些修改操作推入一個隊列中&#xff0c;并在下一個事件循環的“t…

Shell | shell腳本中使用cp指令(外兩則)

sample"ENCFF253NIN" #等號兩側避免使用空格 source_path"/home/xxzhang/workplace/project/CRISPRa/Pacbio/CCS_TE.2/" target_path"./" cp "$source_path"/00-common_all.vcf.gz "$target_path" cp "$source_path&qu…

如何在Python中實現迭代器和可迭代對象

在Python中&#xff0c;可迭代對象&#xff08;iterable&#xff09;是一個對象&#xff0c;它可以返回一個迭代器&#xff08;iterator&#xff09;用于遍歷其元素。迭代器是一個對象&#xff0c;它有一個 __next__() 方法&#xff08;在Python 2中&#xff0c;它是 next() 方…

LiveGBS流媒體平臺GB/T28181用戶手冊-用戶管理:添加用戶、編輯、關聯通道、搜索、重置密碼

LiveGBS流媒體平臺GB/T28181用戶手冊-用戶管理:添加用戶、編輯、關聯通道、搜索、重置密碼 1、用戶管理1.1、添加用戶1.2、編輯用戶1.3、關聯通道1.4、重置密碼1.5、搜索1.6、刪除 2、搭建GB28181視頻直播平臺 1、用戶管理 1.1、添加用戶 添加用戶&#xff0c;可以配置登陸用戶…

STM32-按鍵控制LED

接上篇LED點亮;http://t.csdnimg.cn/9r6z7 目錄 一.硬件設計 二.軟件設計 三.完整代碼 四.結束語 一.硬件設計 按鈕接電源插入PB0引腳,如上圖所示 二.軟件設計 void key_init() {GPIO_InitTypeDef GPIO_InitStruct;//使能時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO…

【LeetCode:496. 下一個更大元素 I + 單調棧】

&#x1f680; 算法題 &#x1f680; &#x1f332; 算法刷題專欄 | 面試必備算法 | 面試高頻算法 &#x1f340; &#x1f332; 越難的東西,越要努力堅持&#xff0c;因為它具有很高的價值&#xff0c;算法就是這樣? &#x1f332; 作者簡介&#xff1a;碩風和煒&#xff0c;…

問題解決記錄1:nvidia-container-cli: initialization error: load library failed

本地docker運行 $ docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi 遇到這種報錯 Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error dur…

案例分享|Alluxio在自動駕駛模型訓練中的應用與部署

分享嘉賓&#xff1a; 楊林三-輝羲智能 關于輝羲智能&#xff1a; 輝羲智能致力打造創新車載智能計算平臺&#xff0c;提供高階智能駕駛芯片、易用開放工具鏈及全棧自動駕駛解決方案&#xff0c;運用獨創性“數據閉環定義芯片”方法學&#xff0c;助力車企構建低成本、大規模和…

百度生成數據庫

問題1&#xff1a; 幫我創建2個表student與score表&#xff0c;要求student表有id,createDate,userName,phone,age,sex,introduce&#xff0c; 要求score表有id,scoreName,result,studentId(student表的id外鍵)。 要求student表中插入5條學生信息&#xff0c;都要是中文的。 要…

docker flow

docker --version docker build -t tagname:version docker run --networknetwork --namename -p port:port imageName docker rmi docker rm docker images docker rm docker start docker stop

設計模式5——抽象工廠模式

寫文章的初心主要是用來幫助自己快速的回憶這個模式該怎么用&#xff0c;主要是下面的UML圖可以起到大作用&#xff0c;在你學習過一遍以后可能會遺忘&#xff0c;忘記了不要緊&#xff0c;只要看一眼UML圖就能想起來了。同時也請大家多多指教。 抽象工廠模式&#xff08;Abst…