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 和別名,剩下的就是原變數的型...