函式指標以及指標的高階用法

2021-08-31 13:33:27 字數 2064 閱讀 7578

1.首先需要更新一下對於宣告的理解:

int *f;
我們可以將其看做兩部分:一是資料型別,而是宣告表示式。對宣告表示式求值就會返回乙個給定型別(這裡為int型別)的值。

2.之後我們還要區分舊式的宣告與新式的宣告:以上給出的就是乙個舊式的宣告方式,而ansi c要求要求我們使用完整的函式原型進行宣告,使宣告更為明確。即還需要給出函式的引數型別,如下例所示:

int *f(int, double);
3.如下**,依據上文,我們要先對宣告表示式進行求值,f先與()結合,說明它是乙個函式,之後與*結合。函式與定址操作符結合就是對函式進行定址操作,即對函式的返回值進行定址操作。

int *f();
4.如果a的屬性為external或者作為函式引數,那麼即使在宣告時未註明長度,也任然是合法的。

int a;
5.(*f)()為函式指標,就像上文提到的*與函式結合表示對函式的返回值進行定址操作後會得到乙個int型別的值

int *(*f)();
6.f是乙個函式,它返回的是乙個整型陣列。但是這個宣告是非法的,函式只能返回標量值,不能返回陣列

int f()
7.f似乎是乙個陣列,它的型別是返回值為整型的函式。這個宣告也是非法的,因為陣列元素必須具有相同的長度,而函式顯然可能具有不同的長度。

int f();
8.  首位址為0的函式

(void(*)()) 對void(*)()新增括號即為型別轉換符,將0轉換為此型別函式的指標。

*(void(*)()) 對函式定址,即得到函式名(當然編譯器在呼叫時函式轉換為指標)。

(*(void(*)())) 呼叫函式。

( *(void(*)())0 )();
9. 1.*f指標陣列。 2.(*f)() 陣列中的指標指向的是函式型別 3.與*結合即對函式定址後得到的是int型別的資料。即:所以這個宣告建立了乙個指標陣列,指標所指向的型別是返回值為int型別的指標。

int *(*f)();
根據乙個已有的宣告,只需要兩步就可以得到型別轉換符:

將 變數名 和 宣告末尾的分號去掉。

再將剩餘的部分用乙個括號封裝起來。

以下為宣告:

float (*h)();
以下就是此型別的型別轉換符:

(float (*)())
1. 初始化函式指標時,對函式名&的操作是可選的。因為函式名被使用時總是由編譯器轉換為函式指標,&操作符只是顯示地說明了編譯器將隱式完成的任務。

2.  int  ( *(*f()) )[10];    int  ( *(*f)() )[10];

//函式指標(*func)()指向返回值是指向int型別陣列的指標。

//返回值型別是指標而不是陣列,所以是允許的。

int(*((*func)()))[10];

//函式返回二級指標,二級指標指向int型別陣列。

//兩個*之間的括號可以省略。

int(*(*f()))[10]

3. int  ( * ( (*x) [10] ) )();

(*x)   --->   指標

(*x)[10]   --->   陣列指標

( * ( (*x) [10] ) )   --->   陣列中儲存的為指標型別

int  ( * ( (*x) [10] ) )()   --->   指標指向的是返回值為int型別的函式

函式指標以及指標函式

1.函式指標 每個函式都占用一段記憶體單元,它們有乙個起始位址,指向函式入口位址的指標,稱為函式指標。一般形式 資料型別 指標變數名 參數列 int maxvalue int x,int y intminvalue int x,int y intadd int x,int y int p int a...

函式指標的用法

函式指標的用法 by zieckey 在程式執行中,函式 是程式的演算法指令部分,它們和陣列一樣也占用儲存空間,都有相應的位址。可以使用指標變數指向陣列的首位址來呼叫陣列資料,也可以使用指標變數指向函式 的首位址來呼叫函式,指向函式 首位址的指標變數就稱為函式指標。1 函式指標定義 函式型別 指標變...

函式指標的用法

定義函式指標兩種方法 1.typedef int myfun int,int 2.int myfun int,int 上面的例子定義myfun 是乙個函式指標,函式型別是帶兩個int 引數,返回乙個int 在分析這種形式的定義的時候可以用下面的方法 先去掉typedef 和別名,剩下的就是原變數的型...