c語言函式指標定義,C語言函式指標定義

時間 2021-08-30 09:32:14

1樓:韌勁

【函式指標】

在程式執行中,函式**是程式的演算法指令部分,它們和陣列一樣也佔用儲存空間,都有相應的地址。可以使用指標變數指向陣列的首地址,也可以使用指標變數指向函式**的首地址,指向函式**首地址的指標變數稱為函式指標。

1.函式指標定義

函式型別 (*指標變數名)(形參列表);

「函式型別」說明函式的返回型別,由於「()」的優先順序高於「*」,所以指標變數名外的括號必不可少,後面的「形參列表」表示指標變數指向的函式所帶的引數列表。

例如:int (*f)(int x);

double (*ptr)(double x);

在定義函式指標時請注意:

函式指標和它指向的函式的引數個數和型別都應該是—致的;

函式指標的型別和函式的返回值型別也必須是一致的。

2.函式指標的賦值

函式名和陣列名一樣代表了函式**的首地址,因此在賦值時,直接將函式指標指向函式名就行了。

例如,int func(int x); /* 宣告一個函式 */

int (*f) (int x); /* 宣告一個函式指標 */

f=func; /* 將func函式的首地址賦給指標f */

賦值時函式func不帶括號,也不帶引數,由於func代表函式的首地址,因此經過賦值以後,指標f就指向函式func(x)的**的首地址。

3.通過函式指標呼叫函式

函式指標是通過函式名及有關引數進行呼叫的。

與其他指標變數相類似,如果指標變數pi是指向某整型變數i的指標,則*p等於它所指的變數i;如果pf是指向某浮點型變數f的指標,則*pf就等價於它所指的變數f。同樣地,*f是指向函式func(x)的指標,則*f就代表它所指向的函式func。所以在執行了f=func;之後,(*f)和func代表同一函式。

由於函式指標指向儲存區中的某個函式,因此可以通過函式指標呼叫相應的函式。現在我們就討論如何用函式指標呼叫函式,它應執行下面三步:

首先,要說明函式指標變數。

例如:int (*f)(int x);

其次,要對函式指標變數賦值。

例如: f=func; (func(x)必須先要有定義)

最後,要用 (*指標變數)(參數列);呼叫函式。

例如: (*f)(x);(x必須先賦值)

【例】任意輸入n個數,找出其中最大數,並且輸出最大數值。

main()

printf("the max number is:%d",a)

}f(int x,int y)

執行結果為:

343 -45 4389 4235 1 -534 988 555 789↙

the max number is:4389

函式指標

函式指標:是指向函式的指標變數,在c編譯時,每一個函式都有一個入口地址,那麼這個指向這個函式的函式指標便指向這個地址。

函式指標的用途是很大的,主要有兩個作用:用作呼叫函式和做函式的引數。

函式指標的宣告方法:

資料型別標誌符 (指標變數名) (形參列表);

一般函式的宣告為:

int func ( int x );

而一個函式指標的宣告方法為:

int (*func) (int x);

前面的那個(*func)中括號是必要的,這會告訴編譯器我們宣告的是函式指標而不是宣告一個具有返回型為指標的函式,後面的形參要視這個函式指標所指向的函式形參而定。

然而這樣宣告我們有時覺得非常繁瑣,於是typedef可以派上用場了,我們也可以這樣宣告:

typedef int (*pf) (int x);

pf pf;

這樣pf便是一個函式指標,方便了許多。當要使用函式指標來呼叫函式時,func(x)或者 (*fucn)(x) 就可以了,當然,函式指標也可以指向被過載的函式,編譯器會為我們區分這些過載的函式從而使函式指標指向正確的函式。

例子:typedef void (*pft) ( char ,int );

void bar(char ch, int i)

pft pft;

pft = bar;

pft('e',91);

2樓:匿名使用者

函式指標就是函式的指標。它是一個指標,指向一個函式。看例子:

a) char * (*fun1)(char * p1,char * p2); b) char * *fun2(char * p1,char * p2); c) char * fun3(char * p1,char * p2); 看看上面三個表示式分別是什麼意思? c):這很容易,fun3 是函式名,p1,p2 是引數,其型別為char *型,函式的返回值為char *型別。

b):也很簡單,與c)表示式相比,唯一不同的就是函式的返回值型別為char**,是個二級指標。 a):

fun1 是函式名嗎?回憶一下前面講解陣列指標時的情形。我們說陣列指標這麼定義或許更清晰:

int (*)[10] p; 再看看a)表示式與這裡何其相似!明白了吧。這裡fun1 不是什麼函式名,而是一個指標變數,它指向一個函式。

這個函式有兩個指標型別的引數,函式的返回值也是一個指標。同樣,我們把這個表示式改寫一下:char * (*)(char * p1,char * p2) fun1;

3樓:黃邦勇帥哥哥

好像不行啊,加了typedef void* (*pfn)(void);這一句會出現這樣的錯誤

「return」: 無法從「pfn (__cdecl *)(void)」轉換為「pfn」,

實在想不通,反回函式名應該使用什麼型別。

4樓:匿名使用者

pfn fn = t1 ;

pfn t1();

這個怎麼定義啊

t1返回 函式指標, 又是函式指標的初始值,搞笑把樓主這不是死迴圈了!

typedef int(*pfn)(int p);

pfn fn = t1;->說明t1為:int t1(int p);

pfn t1();//error

樓主你太有才了

5樓:

在最上面加一句這樣的定義

typedef void*(*pfn)();

pfn可以這樣理解:首先pfn是一個指標,指標指向一個函式(或者說pfn是一個函式指標),此函式返回一個無型別的指標。最終定義的變數及函式都是指標罷了,不過是指標的型別不同。

所以在編譯時會有警告,說指標型別不匹配。但對於程式來講,都是可以在特定的上下文中使用的。

執行結果是

t1,t2交替出現。

其實void也可以換為其它的型別如int, double等又想到一個很好的辦法:

這次編譯不會有警告,執行也不會出錯。

示例**如下所示

#include

long t1();

long t2();

int main()

}long t1()

long t2()

6樓:匿名使用者

#include

typedef void* (*pfn)(void);

pfn t1();

pfn t2();

int main()

}pfn t1()

pfn t2()

c語言如何宣告一個返回函式指標的函式?

7樓:

c語言指向函式的指

針承載的資訊比較複雜,組織起來要素要寫全。根據指向函式的指標的書寫語法,下面的**就是一個返回函式指標的函式:

int (*f(void))(int)

以下**可以驗證上述函式的正確性:

//#include "stdafx.h"//if the vc++6.0, with this line.

#include "stdio.h"

int fun(int n)

int (*f(void))(int)

int main(void)

輸出是:

abcdef100

8樓:匿名使用者

typedef int (*aa)();

aa function();

9樓:匿名使用者

返回值型別名 *函式名( 形參列標 ) //函式名前的*號不能丟

10樓:匿名使用者

int (*pf)();pf=f; /*f為函式名*/

函式指標變數

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

我們把這種指向函式的指標變數稱為「函式指標變數」。

函式指標變數定義的一般形式為:

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

其中「型別說明符」表示被指函式的返回值的型別。「(* 指標變數名)」表示「*」後面的變數是定義的指標變數。 最後的空括號表示指標變數所指的是一個函式。

例如: int (*pf)();

表示pf是一個指向函式入口的指標變數,該函式的返回值(函式值)是整型。

下面通過例子來說明用指標形式實現對函式呼叫的方法。

int max(int a,int b)

main()

從上述程式可以看出用,函式指標變數形式呼叫函式的步驟如下:1. 先定義函式指標變數,如後一程式中第9行 int (*pmax)();定義pmax為函式指標變數。

2. 把被調函式的入口地址(函式名)賦予該函式指標變數,如程式中第11行 pmax=max;

3. 用函式指標變數形式呼叫函式,如程式第14行 z=(*pmax)(x,y); 呼叫函式的一般形式為: (*指標變數名) (實參表)使用函式指標變數還應注意以下兩點:

a. 函式指標變數不能進行算術運算,這是與陣列指標變數不同的。陣列指標變數加減一個整數可使指標移動指向後面或前面的陣列元素,而函式指標的移動是毫無意義的。

b. 函式呼叫中"(*指標變數名)"的兩邊的括號不可少,其中的*不應該理解為求值運算,在此處它只是一種表示符號。

11樓:你好_我來也

int (*(* func)())();

int* (*func1)();

c語言,函式指標定義中實參表為空的問題。

12樓:gta小雞

如果函式宣告是void fun(int n,char *s)

那麼指向該函式的指標宣告也必須是void (*pf)(int,char*)

void (*pf)()是錯誤的,不能用於指向該函式。

13樓:愛永遠都沒完

函式指標只是個指標,關鍵是呼叫時,引數是否一致。

c語言中函式指標用法,C語言中函式指標用法

函式在記憶體中有一個物理位置,而這個位置是可以賦給一個指標的。一零點函式的地址就是該函式的入口點。因此,函式指標可被用來呼叫一個函式。函式的地址是用不帶任何括號或引數的函式名來得到的。這很類似於陣列地址的得到方法,即,在只有陣列名而無下標是就得到陣列地址。怎樣說明一個函式指標變數呢 為了說明一個變數...

C語言指標函式的問題,關於C語言指標函式的使用問題

你這個問題,就是典型的不瞭解編譯過程的人容易犯的錯誤,關於指標和記憶體分配的問題,樓上已經講了很多了,這裡補充一點 你這段 裡 str hello world 這樣的定義,hello world 字串是屬於const char,編譯的時候,會編譯在const資料區,這一段的資料是受系統保護的,是不允...

c語言 函式定義概念問題,C語言 函式定義概念問題

及時澍雨 先舉個例子 include int max int,int 這是函式max的申明,最後要加分號 int main int max int n,int m 這是函式max的定義部分,最後不加分號 不能在函式體內定義函式是什麼意思?就是說函式在程式中不能巢狀定義,這個和pascal語言不同,例...