C語言編程:以實例教你學指向函數的指針

2021-01-12 編碼那些事

指針是C語言的精髓,對於初學者來講,指針是C語言語法學習中比較難的知識點,而這裡面指向函數的指針更是不太容易理解。

下面給大家講下怎樣學習理解C語言中指向函數的指針及編程方法和使用例子。

注意:這是一篇關於C語言編程的基礎語法內容,C語言大神請繞過。

基本概念

首先,先不要把指向函數的指針認為太難了,它和普通的指針區別也不是太大,只是定義形式上有所區別。

比如,對於一個指向整形的普通指針,定義形式如下:

int *p;

在定義中,指針變量的名稱是p,符號「*」說明了p是一個指針,int說明這個指針指向的是整形變量。

那麼,如果我們定義一個指向函數的指針,假設變量名稱為p,比如它指向這樣的一個函數,這個函數需要兩個整形參數,其返回值也是整形參數,其定義如下:

int (*p)(int, int);

對這個定義分解一下,其中,p是變量的名稱,符號「*」說明了p是一個指針,由於這個指針指向的是一個函數,所以在定義中必須體現函數的輸入輸出參數信息,那麼最前面的int指的就是函數的返回值為int類型,後面的(int, int)則定義了該函數需要兩個整形的輸入參數。另外,必須將「*」與「p」必須用括號寫成(*p)的形式,否則,由於括號的優先級大於*的優先級,去掉括號的話就成為另外一種意思了。

這樣對比著理解,指向函數的指針似乎與普通指針區別也不是太大。

指向函數的指針編程例子

下面通過一個例子演示指向函數的指針的使用方法。

該例子的功能是,對於一個輸入的一維數組,定義三個函數findMax、findMin和getAvg,分別實現查找該數組的最大值、最小值及計算該數組的平均值,這三個函數的輸入輸出參數完全相同。定義一個fun函數,在該函數的參數中,需要一個指針變量作參數,這個指針能夠指向上面的三個函數。在主程序中,調用fun函數,根據傳入不同的p值實現對輸入的一維數組作不同的處理功能。

下面先看下幾部分的實現代碼吧。

1、findMax、findMin和getAvg代碼實現

這三個函數對一維數組x,分別作求最大值、最小值及平均值的處理,並將其結果返回。C語言代碼如下:

這三個函數比較簡單,函數原型完全一樣,輸入參數為一個指向double的指針x及x的元素個數n,輸出參數也就是返回值是一個double型的數值。

2、fun函數的代碼實現

該函數輸入參數為3個,前兩個為指向double的指針x及x的元素個數n,第三個為一個指向函數的指針類型,這個指針能夠指向上面的三個函數。C語言代碼如下:

那麼,在主程序中可以調用該函數,只要輸入不同的p值,就可以對輸入的一維數組作不同的處理運算。

3、主程序測試代碼

主程序C語言測試代碼如下:

第43-44行定義了一個包含5個元素的一維數組x及存儲數據處理結果的變量max、min及avg。

第46-48行,調用fun函數,將函數findMax、findMin和getAvg的名稱作為參數傳入到該函數中,在控制臺上輸出其處理運算結果。

其運行界面如下圖所示:

可見,在這個例子中已經成功的使用了指向函數的指針作為參數,並得到了正確的運行結果。

總結

指向函數的指針,理解其定義形式,掌握其基本用法,似乎也不是太難了。

相關焦點

  • C語言陷阱與技巧31節,都說void*指針是「萬能指針」,它萬能在哪
    為什麼使用 void * 指針僅從上面的實例來看,使用 void 指針似乎比較麻煩:至少強制類型轉換操作是少不了的。那為什麼還要使用 void 指針呢?型」,這其實要求程式設計師事先了解 void 指針指向的數據結構(本例是 char 型),否則就沒法使用 void * 指針。
  • C語言中的main函數參數,你了解嗎?
    小豆丁:今天我才發現,C語言中main函數還有參數,可是我不知道這個參數表示的是什麼含義,也不知道怎麼用。老張:就這點問題?小豆丁:嗯吶,我沒研究明白,好沮喪...老張:這個問題不難,別放棄哈,我教你!
  • C語言編程技巧:以實例跟我學動態數組的創建及使用方法
    如定義一個數組,用來存儲給定的已知數組中所有大於3的元素,很明顯,這個數組的大小是不確定的,用靜態數組的定義方式是不合適的,除非你定義的數組大小足夠大,能包括足夠多的元素,但這樣會造成內存的浪費。所以,這種場合下動態數組就派上用場了。在C語言中提供了諸如內存的申請、釋放等管理函數,然後結合指針可以按需動態地分配內存空間,來構建動態數組,達到有效利用計算機內存資源的手段。
  • C語言的指針,簡介
    指針,是一個表示變量或函數的地址的無符號整數。指針的字節數,與CPU的位數有關,32位機是4位元組,64位機是8位元組。與高級語言的long類型的大小是一致的。所以在java的JNI庫裡,如果需要把native層的C結構體的指針保存到java層,一般是定義一個long類型的變量。指針指向的變量,可以是普通變量、數組變量、結構體變量,以及數組元素、結構體的成員變量,還可以是指針變量。指針還可以指向函數,叫做函數指針。
  • 你已經是個成熟的985大學了,請不要在大一教 C 語言!
    指針指針也是其它語言中引用的基礎,深入理解指針對於理解引用也有很大幫助。就拿文件來說,在 C 語言 中經常會接觸到 read、write 系統函數,清楚操作的打開文件對應的是文件描述符。所以這才是我認為大一先上 C 語言的核心原因:一是語法簡單,更加貼近計算機本質的一些東西,學 C 也不是簡單的學語言本身,而是想透過 C 語言去理解一些如寄存器、內存、函數調用、跳轉等東西。
  • 信息學競賽需要掌握哪些程式語言知識
    信息學競賽現在已經受到越來越多的人的關注,怎麼走進信息學競賽的大門呢?一、程式語言選擇信息學聯賽主要考的是程序設計,選擇合適的參賽程式語言是首要選擇,信息學競賽的程式語言有三種:pascal語言、c語言、c++語言,pascal語言將於2022年停止在信息學競賽中使用,所以現在學習pascal語言意義不大,剩下的只有選擇c語言和c++語言,實際考試中絕大多數考生選擇
  • 青少年信息學競賽Pascal語言:指針(十)
    合肥奧數網訊:合肥市青少年信息學競賽Pascal語言:指針   指針   指針是通過地址來訪問變量的一種特殊的數據類型,屬於動態的數據結構,它可以在需要時產生,用完後則又可以取消或回收,以減少佔用的內存空間。指針變量與其他類型的變量不同,它佔有的不是數據,而是地址。
  • C語言,局部變量的指針,棧幀
    C/C++不能返回局部變量的指針,是一條重要的語法規則。至於為什麼,則不是那麼顯眼。局部變量,是分配在棧上的變量,隨著函數調用的返回而失效。函數調用結束之後,局部變量的指針,也就是野指針了,不能在函數外繼續使用。
  • C語言|文件指針、fopen()、fscanf()、fclose()
    這是一個簡單的文件系統fscanf()函數的功能是把磁碟文件數據讀出保存到變量(內存)每一個文件都有自己的FILE結構和文件緩衝區exit(0)是系統標準函數,作用是關閉所有打開的文件,並終止程序的執行。
  • 函數式編程很難,所以你要學習它
    很 奇怪不是,很少有人每天都使用函數式程式語言。如果你用Scala,Haskell,Erlang,F#或某個Lisp方言來編程,很可能沒有公司會花錢 聘你。這個行業裡的絕大部分人都是使用像Python,Ruby,Java或C#等面向對象的程式語言——它們用起來很順手。不錯,你也許會偶然用到一兩 個「函數式語言特徵」,例如「block」,但人們不會去做函數式編程。
  • C Primer Plus怎樣高效學?C語言大神案例值得借鑑!
    我們常常聽到有人爭論「Python、Java、PHP......是這個世界上最好的語言」,卻很少聽到有人誇讚C語言,為什麼呢?因為C語言實在是太太太太難了......為什麼這麼多人學不會C語言呢?因為很多人覺得用C語言作為入門語言覺得太難了,裡面還有指針,回調,遞歸之類的操作太難了。為什麼這麼多人覺得C語言難?
  • 奇怪的C語言代碼,在變量前加上(void)是什麼操作?有什麼用?
    C語言的語法極其簡潔,即使是初次接觸程式語言的初學者也能很快學完它的語法。不過,C語言也是一門「靈活得過了頭」的程式語言,對於很多初學者來說,編寫C語言程序就好像拿著一堆最基本的磚塊,要修建一座大廈一樣,茫然找不到方向。
  • C語言中的「不透明」指針是什麼,它有什麼用呢?
    雖說指針是C語言中比較複雜的語法,但是確實非常好用,因此我寫過不少文章討論C語言中的指針,相信對初學者理解指針有一定的幫助。事實上,的確有讀者私信我說看了這些文章,「總算不再畏懼指針了」。不過他同時也問了一個問題:C語言有「不透明指針(opaque pointer)」嗎?
  • C語言中const關鍵字的妙用總結
    在編程實踐中你對const的使用是否有困惑呢?今天就給大家一起來探討總結,期望能夠大家解惑並提供參考。C語言中const關鍵字是constant的縮寫,通常翻譯為常量、常數等,有些朋友一看到const關鍵字馬上就想到了常量。事實上在C語言中const功能很強大,它可以修飾變量、數組、指針、函數參數等。
  • 言C語言陷阱與技巧第21節,函數只能返回一個值嗎?有多個返回值怎麼...
    如今幾乎找不到只專注於一門程式語言的程式設計師了。大多數程式設計師在自己平時的工作和生活中,一般都使用不止一門程式語言,例如小編在工作中主要使用的是C語言,但是有時候驗證算法也會使用 matlab 和 python,在業餘做別的項目時還會用到 C#。
  • 第四篇:C語言中指針與字符串核心知識點梳理
    這就涉及到本文要講到的第一個核心概念:指針。重點包括:指針處理一維數組、動態內存分配等。C語言的基本數據類型中有一個char的關鍵詞,可以存儲單個的字符。那麼,像漢字以及由多個字符組成的內容,又該如何存儲呢?
  • ARM中ADS環境下C語言和彙編語言混合編程及示例
    彙編語言是和CPU的指令集緊密相連的,作為涉及底層的嵌入式系統開發,熟練對應彙編語言的使用也是必須的。這裡主要討論C和彙編的混合編程,包括相互之間的函數調用。下面分四種情況來進行討論,不涉及C++語言。
  • 51單片機基礎剖析(基於C語言)
    除非你對你的程序以及單片機的工作過程非常熟悉,否則會帶來不必要的麻煩。具體原因由於篇幅的限制暫不討論。C51中斷程序編寫要求:1.中斷函數不能進行參數傳遞,否則,將導致編譯出錯2.中斷中,不能包含任何參數聲明,否則,將導致編譯出錯。
  • 在C語言中如何高效地複製和連接字符串?
    就目前而言,在編程領域中,C語言的運用非常之多,它兼顧了高級語言的彙編語言的優點,相較於其它程式語言具有較大優勢。函數的第一個子集是由Unix第七版在1979年引入的,它由strcat、strncat、strcpy和strncpy函數組成。儘管這四個函數都在Unix的各種版本中使用,但通常情況下,對這些函數的調用卻沒有使用它們的返回值。儘管這些函數可以同樣很容易地定義為返回一個指針來指向最後一個複製的字符(或它的後一位),而且事實證明這種做法也非常有用。
  • C/C+編程筆記:C語言編程面試常見問題,全是經典題!
    如果有剛剛學習編程的小夥伴也可以看一下,都是當時大學應該學懂的,但是因為我以前沒有好好聽課,有些也沒有注意到,現在也是提醒大家吧~ C語言的主要特徵是什麼?