如何定義指向函式的指標陣列,如何定義一個指向函式的指標陣列

2021-08-11 19:13:50 字數 6183 閱讀 3788

1樓:匿名使用者

這個用typedef可以完成:

先定義一個函式指標的型別:typedef void (*pfun)();

然後用這個型別pfun定義一個陣列

pfun ptr[5];//裡的數字是陣列元素的個數,依情況而定:這兒用5做例子

這樣ptr就是一個指向函式指標的陣列。

對於「把一個指標強制定義」這我還沒聽過這個說法,只聽過把指標強制轉換成某個型別的指標:

強制型別轉換用()運算,仍然用上面的定義型別。

例如:void *p;//p是一個void指標

pfun ptr;//ptr是一個指向void函式的指標

ptr=(pfun)p;//把p強制轉換成指向void函式的指標,然後就可以把它賦值給ptr指標。

不用typedef也可以,只要合併就可以了:

void (*ptr[5])();//這樣ptr就是一個函式指標陣列了.這樣看很費解的!不如用typedef。

對於強制型別轉換最好還是用typedef,那樣可讀性好。

而且個人認為指標沒有那種基本型別(指向函式的指標型別),那是一種新的型別。所以要先定義那種型別才行。

用typedef定義新型別又沒有什麼***,而且容易讀懂,何必非要不用typedef呢?!沒必要把簡單的問題複雜化!!

程式**的可讀性是很重要的,寫複雜的型別而不用typedef是很令人反感的!

2樓:du瓶邪

定義方法為:

double add(double a,double b);

double sub(double a,double b);

double mul(double a,double b);

double div1(double a,double b);

double (*func)(double,double);

引數個數,型別,返回值與所指向的函式一致,亦即這是定義了一個統配的型別。

帶函式指標的函式的定義方法:

void printf(func *f)

3樓:匿名使用者

。。。我倒從來沒想過這個問題。。。

一般在函式內,this就代表這個函式。

函式指標的型別是什麼我不知道。

賦值的話,在每個函式裡把this的值賦進陣列就可以了。

4樓:伊·梵

"函式的返回值是void或者 其他型別"

說明函式指標的型別不同

如果陣列中的元素型別不相同,那還叫陣列嗎?

5樓:

typedef void (*pffunction)();

pffunction a;

(pffunction)p ,把p強制轉換成函式指標

6樓:匿名使用者

int (*a)(int)

7樓:匿名使用者

typedef (void)(*pfn)();

pfn myfoo;

void foo()

myfoo=foo;

如何定義指向函式的指標?

8樓:匿名使用者

一、定義一個函式指標的方法如下:

返回值型別 (* 指標變數名)([形參列表]);

1、int func(int x); /* 宣告一個函式 */2、int (*f) (int x); /* 宣告一個函式指標 */3、f=func; /* 將func函式的首地址賦給指標f */二、函式指標的用法:

函式指標的應用:(*指標變數名)(引數列表)如:int c=(*ptr)(a,b);/* 函式指標 的使用*/在c語言中,函式本身不是變數,但是可以定義指向函式的指標,也稱作函式指標,函式指標指向函式的入口地址。

這種型別的指標可以被賦值、存放在陣列中、傳遞給函式以及作為函式的返回值等等。

9樓:許詩文

(一) 用函式指標變數呼叫函式

可以用指標變數

指向整形變數、字串、陣列、結構體、也可以指向一個函式。一個函式在編譯時被分配一個入口地址。這個入口地址就稱為函式指標。

可以用一個指標變數指向函式,然後通過該指標變數呼叫此函式。用簡單的數值比較為例:

1 #include

2 #include

3 4 int main()

5 15

16 int max(int x,int y)

17 main函式中的" c = max(a,b); " 包括了一次函式的呼叫。每一個函式都佔用一段記憶體單元。因此,可以用一個指標變數指向一個函式,通過指標變數來訪問它指向的函式。

第7行:int (*p)( int,int ); 用來定義 p 是一個指向函式的指標變數,該函式有兩個整形引數,函式值為整形。注意 *p 兩側的括號不可省略,表示 p 先與 * 結合,是指標變數,然後再與後面的 ( ) 結合,表示此指標變數指向函式,這個函式值 (即函式的返回值) 是整形的。

如果寫成 int *p ( int,int ) ,由於( )的優先順序高於 *,它就成了宣告一個函式p( 這個函式的返回值是指向整形變數的指標)。

賦值語句 p = max ; 作用是將函式 max 的入口地址賦給指標變數p。和陣列名代表陣列首元素地址類似,函式名代表該函式的入口地址。這時 p 就是指向函式 max 的指標變數,此時 p 和 max都指向函式開頭,呼叫 *p 就是呼叫 max 函式。

但是p作為指向函式的指標變數,它只能指向函式入口處而不可能指向函式中間的某一處指令處,因此不能用 *(p + 1)來表示指向下一條指令。

注意:(1) 指向函式的指標變數的一般定義形式為:

資料型別 (*指標變數名)(函式引數列表)

這裡資料型別就是函式返回值的型別

(2) int (* p) ( int,int ); 它只是定義一個指向函式的指標變數 p, 它不是固定指向哪一個函式的,而只是表示定義這樣一個型別的變數,它是專門用來存放函式的入口地址的。在程式中把哪一函式(該函式的值應該是整形的,且有兩個整形引數)的地址賦給它,他就指向哪一個函式。在一個函式中,一個函式指標變數可以先後指向同型別的不同函式。

(3) p = max; 在給函式指標變數賦值時,只需給出函式名而不必給出函式引數,因為是將函式的入口地址賦給 p ,而不涉及 實參和形參的結合問題,不能寫成 p = max(a,b);

(4) c = (*p)(a,b) 在函式呼叫時,只需將( *p ) 代替函式名即可,後面實參依舊。

(5) 對於指向函式的指標變數,像 p++ ,p+n.....是無意義的。

(二) 用指向函式的指標作為函式引數

函式指標變數通常的用途之一就是把指標作為引數傳遞到其他函式。

函式的引數可以是變數、指向變數的指標變數、陣列名、指向陣列的指標變數,也可以是指向函式的指標也可以作為引數,以實現函式地址的傳遞,這樣就能夠在被呼叫的函式中使用實參函式。

void sub ( int ( *x1) (int), int (*x2) (int,int) )

如果實參為兩個 函式名 f1 和 f2. 在函式首部定義x1、x2為函式指標變數,x1指向的函式有一個整形形參,x2指向的函式有兩個形參。i 和 j 是函式f1 和 f2所要的引數。

函式sub的形參 x1、x2(指標變數)在函式 sub 未被呼叫時並不佔用記憶體單元,也不指向任何函式。在sub被呼叫時,把實參函式 f1 和 f2的入口地址傳給形式指標變數 x1 和 x2.

既然在 sub 函式中要呼叫 f1 和 f2 函式,為什麼不直接呼叫f1 和 f2而要用函式指標變數呢? 確實,如果只是用到f1 和 f2 函式,完全可以在sub函式中直接呼叫f1 和 f2,而不必設指標變數 x1 和 x2。 但是,如果在每次呼叫sub時,呼叫的函式不是固定的,下次是f3 和 f4,再是f5 和 f6...

這時用指標變數就比較方便了。

10樓:過客守望者

指向函式

的指標的用法:

1.指向函式的指標的型別

指向函式的指標應該怎樣宣告?拿兩個字串的比較函式來說:

int strcompare(const string & s1, const string & s2) ;

如果兩個字串相等就返回0,否則,s1< s2返回負數,s1 > s2返回正數其實函式名不是其型別的一部分,函式型別是隻由它的返回型別和引數來決定。函式名稱只不過是指向函式**的地址。所以指向函式的指標的型別應該用下面的形式聲名:

int (*pf)( const string &, const string & );

2.初始化和賦值

完全匹配時初始化和賦值才是正確的如果不匹配則將產生編譯錯誤訊息在指向函式

型別的指標之間不存在隱式型別轉換。

int (*pfi)( const string &, const string & ) = strcompare;

指向函式的指標可以如下被賦值

pfi = strcompare;

pfi2 = pfi;

3.呼叫

如下**:

#include

using namespace std;

int min( int*, int );

int (*pf)( int*, int ) = min;

const int iasize = 5;

int ia[ iasize ] = ;

int main()

int min( int* ia, int sz )

4.函式指標的陣列

我們可以宣告一個函式指標的陣列例如

int (*testcases[10])();

將testcases 宣告為一個擁有10 個元素的陣列每個元素都是一個指向函式的函式指標,該函式沒有引數返回型別為int。

上面的宣告等價於下面宣告:

typedef int (*pfv)(); // 定義函式型別指標的typedef

pfv testcases[10];

函式指標的陣列可以用一個初始化列表來初始化該表中每個初始值都代表了一個與數

組元素型別相同的函式例如

int lexicocompare( const string &, const string & );

int sizecompare( const string &, const string & );

typedef int ( *pfi2s )( const string &, const string & );

pfi2s comparefuncs[2] =

;// 兩個等價的呼叫

pfcompare[ 0 ]( string1, string2 ); // 編寫

((*pfcompare)[ 0 ])( string1, string2 ); // 顯式

5,引數和返回型別

函式引數的型別不能是函式型別函式型別的引數將被自動轉換成該函式型別的指標

例如// typedef 表示一個函式型別

typedef int functype( const string &, const string & );

void sort( string *, string *, functype );

編譯器把sort()當作已經宣告為

void sort( string *, string *,

int (*)( const string &, const string & ) );

上面這兩個sort()的宣告是等價的

注意除了用作引數型別之外函式指標也可以被用作函式返回值的型別例如

int (*ff( int ))( int*, int );

該宣告將ff()宣告為一個函式它有一個int 型的引數返回一個指向函式的指標型別

為int (*) ( int*, int );

同樣使用typedef 名字可以使宣告更容易讀懂例如下面的typedef pf 使得我們能更

容易地分解出ff()的返回型別是函式指標

typedef int (*pf)( int*, int );

pf ff( int );

函式不能宣告返回一個函式型別如果是則產生編譯錯誤例如函式ff()不能如下

宣告// typedef 表示一個函式型別

typedef int func( int*, int );

func ff( int ); // 錯誤: ff()的返同型別為函式型別

c語言指標陣列如何存放函式地址C語言指標陣列如何存放函式地址

c c 的指標的靈活,常把許多初學者搞暈,連高手也是如此。1.當然,可以呀,一切資料都可返回 2.複合指標型別直接表示非常麻煩 連高手都是這樣 可以分解成多個簡單型別 typedef void funtype void funtype num 100 分解後簡單多了!3.因為函式名不是字串,初始化時...

怎麼用指標的指標指向二維陣列的每個元素

通過二級指標去訪問二維陣列需要先給二級指標分配等同於二維陣列行數的一維陣列指標,然後把二維陣列的每行首地址賦值給對應位置的一維指標上。之後就可以通過二維指標直接訪問了。比如整型二維陣列,先定義int p 然後 根據行數,申請和行數相同的int 指標每個指標指向二維陣列對應行。這樣就可以通過每行的首地...

c如何定義陣列下標

c c 中的下標,必須從0開始。比如int a 10 那麼下標範圍是0到9,你如果想用其它範圍去遍歷,專只好減去或加屬上一個數。比如用1到10去遍歷,for i 1 i 10 i a i 1 i 反正,下標範圍是0到9,這是變不了的。當然你可以定義一個指標p,指向陣列a的中間元素,那麼訪問下標就相應...