1. 程式人生 > >C語言中指向函式的指標

C語言中指向函式的指標

1 定義和呼叫程式在編譯後,每個函式都有一個首地址(也就是函式第一條指令的地址),這個地址稱為函式的指標。可以定義指向函式的指標變數,使用指標變數間接呼叫函式。下面通過一個簡單的例子來說明:float max(float x,float y){return x>y?x:y;}float min(float x,float y){return x<y?x:y;}main(){float a=1,b=2, c;float (*p)(float x, float y);p=max;c=(*p)(a,b); /*等效於 max(a,b)*/printf("\nmax=%f",c);p=min;

c=(*p)(a,b); /*等效於min(a,b)*/printf("\nmin=%f",c); }程式執行的結果為:max=2.000000min=1.000000 

說明:(1)語句float (*p)(float x, float y);定義了一個指向函式的指標變數。函式的格式是:返回值為float型,形式引數列表是(float x, float y)。p定義後,可以指向任何滿足該格式的函式。(2)定義指向函式的指標變數的格式為:(3)資料型別(*指標變數名稱)(形式引數列表);(4)其中資料型別是函式返回值的型別,形式引數列表是函式的形式引數列表。(5)形式引數列表中,引數名稱可以省略。比如,float (*p)(float x, float y);可以寫為:float (*p)(float, float); 

(7)注意指標變數名稱兩邊的括號不能省略(8)語句p=max;將max函式的首地址值賦給指標變數p,也就是使p指向函式max。C語言中,函式名稱代表函式的首地址(9)第一個c=(*p)(a,b);語句:由於p指向了max函式的首地址,(*p)(a,b)完全等效於max(a,b)。函式返回2.0。注意*p兩邊的括號不能省略(10)語句p=min; 將min函式的首地址值賦給指標變數p。p是一個變數,p的值實際上是一個記憶體地址值,可以指向max,也可以指向min,但指向函式的格式必須與p的定義相符合。(11)第二個c=(*p)(a,b);語句:由於p指向了min函式的首地址,(*p)(a,b)完全等效於min(a,b)。函式返回1.0。
(12)將函式首地址賦給指標變數時,直接寫函式名稱即可,不用寫括號和函式引數(13)利用指標變數呼叫函式時,要寫明函式的實際引數。

提示:定義一個指向函式的指標變數時,一定要使用括號。比較下面的兩個定義:float (*p1)(int x, long y);float *p2(int x, long y);第一個語句定義了一個指向函式的指標變數p1;第二個語句聲明瞭一個函式p2,p2的形式引數為(int x, long y),返回值為一個float型的指標。

2 指向函式的指標作為函式引數有 時候,許多函式功能不同,但它們的返回值和形式引數列表都相同。這種情況下,可以構造一個通用的函式,把函式的指標作為函式引數,這樣有利於進行程式 的 模組化設計。比如下面的例子中,我們把對2個float型數進行加、減、乘、除操作的4個函式歸納成一個數學操作函式MathFunc。這樣,在調 用 MathFunc函式時,只要將具體函式名稱作為函式實際引數,MathFunc就會自動呼叫相應的加、減、乘、除函式,並計算出結果。下面是程式的程式碼:float Plus(float f1, float f2);float Minus(float f1, float f2);float Multiply(float f1, float f2);float Divide(float f1, float f2);float MathFunc(float (*p)(float, float), float para1,float para2);main(){float a=1.5, b=2.5;printf("\na+b=%f", MathFunc(Plus, a,b));printf("\na-b=%f", MathFunc(Minus, a,b));printf("\na*b=%f", MathFunc(Multiply, a,b));printf("\na/b=%f", MathFunc(Divide, a,b));}

float Plus(float f1, float f2){return f1+f2;}

float Minus(float f1, float f2){return f1-f2;}

float Multiply(float f1, float f2){return f1*f2;}

float Divide(float f1, float f2){return f1/f2;}

float MathFunc(float (*p)(float, float), float para1,float para2){return (*p)( para1, para2);}

程式執行的結果為:a+b=4.000000a-b=-1.000000a*b=3.750000a/b=0.600000

相關推薦

C語言指向函式指標

1 定義和呼叫程式在編譯後,每個函式都有一個首地址(也就是函式第一條指令的地址),這個地址稱為函式的指標。可以定義指向函式的指標變數,使用指標變數間接呼叫函式。下面通過一個簡單的例子來說明:float max(float x,float y){return x>y?x:y;}float min(f

C語言函式指標

Q:函式指標是什麼意思? A:例如一個指標指向int變數,那麼這個指標就是儲存這個int變數在記憶體中儲存的地址。同理,函式指標就是指向一個函式的指標,那麼這個指標就是儲存這個函式在記憶體中儲存的起始

C語言指向函式指標

這裡介紹了關於指向一維陣列的指標, 相關內容可以參考該文. 本文將簡要介紹指向函式的指標. 如何宣告一個指向函式的指標? void print(int num); // 宣告函式 voi

C語言指向字串常量的指標指向字串陣列的指標

char str[] = "1234567asdf";char*pstr = str;上面是定義了一個字串陣列及一個指向這個字串陣列的指標,可以通過這個指標對陣列中的內容進行操作;例如:*(pstr +

c語言的二級指標函式引數

1.用指標做函式引數申請動態記憶體的問題 //如果函式引數是指標,不能用一級指標做函式引數實現申請動態記憶體 void getMemory(char *p, int num) { p = (char *)malloc(sizeof(char)*num); } void

c語言輸出函式putc_putchar_puts-printf

//輸入輸出:英文是Input/Output 簡稱IO。 //putchar:將指定的數值對應的ASCII字元列印到螢幕上。 //putc:不但指定數值,而且還可以指定列印到哪裡去。 //stdout:是指定列印到螢幕上 standard out . //putc可以指定列印到一個檔案(FILE *

C語言陣列與指標的區別

本文是對《C語言深度剖析》一書內容的拓展,在看這本書的時候解了很多我之前的一些困惑,故在此記錄。對陣列的引用總是可以寫成對指標的引用,而且確實存在一種指標和陣列的定義完全相同的上下文環境。 但是指標和陣列還是在本質上是不一樣的。指標就是指標,指標變數在32位的系統下面是4B

C語言:理解函式指標陣列和定義

函式指標陣列和定義 陣列是一個存放相同型別資料的儲存空間,那我們已經學習了指標陣列,比如:     int *arr[10];//陣列的每個元素是int* 那要把函式的地址存到一個數組中,那這個陣列就叫函式指標陣列,那函式指標的陣列如何定義呢?   int (

C語言陣列型函式指標,替代switch case結構

#include <stdio.h> typedef void (*KeyEvent)(void); KeyEvent pKey_Func[100]; void pFunc0(void) { printf(“Hello Kitty\n”); } void pFun

c語言常用函式

memset void *memset(void *s, int ch, size_t n); 函式解釋:將s中當前位置後面的n個位元組 (typedef unsigned int size_t )

C語言:通過函式指標和引數來呼叫函式

C語言可以通過函式指標來呼叫函式,可以將要呼叫的函式名儲存到陣列中。這樣我們可以通過引數來直接呼叫函數了。 #include <stdio.h> #define FUNCTIONSIZE 2 typedef unsigned char uint8_t;

C語言函式自帶的排序函式qsort

之前一直不知道C語言還有預設的排序函式,而且還是快速排序的函式,當時覺得自己C語言白學了,瞭解之後我覺得應該把這個函式的用法和用例展示出來,供大家參考。 #include <stdlib.h> void qsort( void *buf, size_t num,

關於C語言的陣列指標指標陣列以及二級指標

概念解釋 陣列指標:首先它是一個指標,它指向一個數組,即指向陣列的指標;在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。陣列指標指向的是陣列中的一個具體元素,而不是整個陣列,所以陣列指標的型別和陣列元素的型別有關。 指標陣列:首先

C語言排序函式的用法

C語言中沒有預置的sort函式。如果在C語言中,遇到有呼叫sort函式,就是自定義的一個函式,功能一般用於排序。 一、可以編寫自己的sort函式。 如下函式為將整型陣列從小到大排序。 void sort(int *a, int l)//a為陣列地址,l為陣列長度

C語言結構體指標的定義和引用

指向結構體型別變數的使用 首先讓我們定義結構體: struct stu { char name[20]; long number; float score[4]; } ; 再定義指向結構體型別變數的指標變數: struct stu *p1, *p2 ; 定義指標變數p 1、p 2,分別指向結構體型別變數。

C語言如何用指標交換兩個數的大小

如何用傳址的方式交換兩個數的大小 首先先看第一個程式,用函式的呼叫來解決看似正確實則執行出來的結果是錯誤的 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h>

C語言函式

在對C語言有過一定的瞭解之後,我們都會涉及到一個概念:函式。 那麼,什麼是函式呢? 首先,我們來看一段 程式碼: #include<stdio.h> int Max(int x,int y) { retutn (x>y)

深入理解C語言兩級指標(char **pptr)的引數的用法

最近在看亞嵌的《Linux C程式設計一站式學習》,對其中的兩層指標的引數用法有些疑惑,下面和大家分享一下學習心得! 首先來看一段程式碼: /* main.c */ #include <stdio.h> #include <stdlib.h>

C語言函式呼叫,棧的使用

本文共包含一下四個部分。 C原始碼 註釋 對應彙編程式碼:此彙編使用”gcc -S hello.c”命令編譯生成,部分刪減 棧空間的使用過程:包括5個部分,五張圖 C原始碼 int sayhello(int a,int b,int

c++和c語言函式相互呼叫的問題

1、如何C++程式要呼叫 已編譯後的C函式,該怎麼辦? (1)假設某個C函式的宣告如下: void foo(int x, int y); 該函式被C編譯器編譯後在庫中的名字為_foo,而C++編譯器則會產生像 _foo_int_int之類的名字用來支援過載和型別安全連線。由