1. 程式人生 > 其它 >指標函式和函式指標

指標函式和函式指標

技術標籤:c語言函式指標指標函式c語言指標

指標函式和函式指標

指標函式:

概念理解:

指標函式是指函式返回的型別是某型別的指標的函式。【大白話:“指標”是定語,修飾主語“函式”,所以指標函式就是一個函式,只不過返回的資料型別有點特殊,是個地址值】

宣告格式:

型別說明符 *函式名(引數)

int *f(int x,int y){
    ......
}
//這裡就是定義了一個返回值型別為指向整型變數的指標的函式,所以函式f就是一個指標函式
指標函式的呼叫:
int *p;
p=f(3,7);
//函式的返回值必須用同類型的指標變數來接收

函式指標:

概念理解:

在C語言中,一個函式總是佔用一段連續的記憶體區,而函式名就是該函式所佔記憶體的首地址。我們可以把函式的這個首地址(或稱入口地址)賦予一個指標變數,使該指標變數指向該函式。然後通過指標變數就可以找到並呼叫這個函式。我們把這種指向函式的指標變數稱為“函式指標變數”,也就是函式指標了。

【大白話:“函式”是定語,修飾“指標”,所以函式指標就是一個指標,這個指標指向的是一個函式的入口地址】

宣告格式:

型別說明符(*指標變數名)();

int (*fptr)();  //宣告一個函式指標
函式指標的賦值:
fptr=&func
fptr=func
/*
上面兩種寫法都表示同一個意思,即將func函式的首地址賦值給指標fptr。這裡也可以省略&,因為單單一個函式名就代表著函式的首地址
*/
函式指標的呼叫:
int x;
x=(*fptr)();
x=fptr();
/*
兩種寫法都對,如果函式指標所指的函式是需要傳遞引數的,需要在後面的括號裡寫上要傳遞的引數,
例如:x=fptr(引數1,引數2,......)
*/
函式指標的例子:
void A{
    printf("A\n");
}
void B{
    printf("B\n");
}
int main (){
    void (*funcp)();	//定義一個函式指標
    funcp=A;			//把函式A的首地址賦值給函式指標funcp
    (*funcp)();			//呼叫A這個函式,因為是void型,所以不需要引數來接收
    funcp=B;			//現在把函式B的首地址賦值給funcp
    (*funcp)();			//呼叫函式B
}
//程式輸出的結果是:A (換行) B

下面用一個例子來實踐一下函式指標:

#include <stdio.h>

void printElement(int n) {
	printf("%d  ", n);
}

void TraverseLinkList(int p[5],void (*visit)(int m)) {
	int n;
	for (n = 0; n < 5; n++) {
		visit(p[n]);	//呼叫傳遞過來的函式
	}
}

int main() {
	int num[5] = { 2,4,6,8,10 }; //定義一個數組

	void (*fpt)(int n);			 //定義一個函式指標變數
	fpt = printElement;			 //讓這個指標指向printElement函式的首地址
	TraverseLinkList(num,fpt);	

	return 0;
}
//程式輸出為:2	4	6	8	10

以上是個人在學習過程中的一些理解和記錄,如有錯誤,歡迎指正批評~~~

參考資訊來源:https://zhidao.baidu.com/question/95800995.html