乙個函式總是占用一段連續的記憶體區域,函式名在表示式中有時也會被轉換為該函式所在記憶體區域的首位址,這和陣列名非常類似。我們可以把函式的這個首位址(或稱入口位址)賦予乙個指標變數,使指標變數指向函式所在的記憶體區域,然後通過指標變數就可以找到並呼叫該函式。這種指標就是函式指標。
函式指標的定義形式為:
returntype (
*pointername)
(param list)
;
returntype 為函式返回值型別,pointernmae 為指標名稱,param list 為函式引數列表。引數列表中可以同時給出引數的型別和名稱,也可以只給出引數的型別,省略引數的名稱,這一點和函式原型非常類似。
注意( )
的優先順序高於*
,第乙個括號不能省略,如果寫作returntype *pointername(param list);
就成了函式原型,它表明函式的返回值型別為returntype *
。
【例項】用指標來實現對函式的呼叫。
純文字複製
#include
//返回兩個數中較大的乙個
intmax
(int a,
int b)
intmain()
執行結果:
input two numbers:
1050↙
max value:
50
第 16 行**對函式進行了呼叫。pmax 是乙個函式指標,在前面加 * 就表示對它指向的函式進行呼叫。注意( )
的優先順序高於*
,第乙個括號不能省略。
指標(pointer)變數存放的是記憶體位址。指標變數可以存放基本型別資料的位址,也可以存放陣列、函式以及其他指標變數的位址。
程式在執行過程中需要的是資料和指令的位址,變數名、函式名、字串名和陣列名在本質上是一樣的,它們都是位址的助記符:在編寫**的過程中,我們認為變數名表示的是資料本身,而函式名、字串名和陣列名表示的是**塊或資料塊的首位址;程式被編譯和鏈結後,這些名字都會消失,取而代之的是它們對應的位址。
定 義含 義
int *p;
p 可以指向 int 型別的資料,也可以指向類似 int arr[n] 的陣列。
int **p;
p 為二級指標,指向 int * 型別的資料。
int *p[n];
p 為指標陣列。[ ] 的優先順序高於 *,所以應該理解為 int *(p[n]);
int (*p)[n];
p 為二維陣列指標。
int *p();
p 是乙個函式,它的返回值型別為 int *。
int (*p)();
p 是乙個函式指標,指向原型為 int func() 的函式。
指標變數可以進行加減運算,例如p++
、p+i
、p-=i
。指標變數的加減運算並不是簡單的加上或減去乙個整數,而是跟指標指向的資料型別有關。
給指標變數賦值時,要將乙份資料的位址賦給它,不能直接賦給乙個整數,例如int *p = 1000;
是沒有意義的,使用過程中一般會導致程式崩潰。
使用指標變數之前一定要初始化,否則就不能確定指標指向**,如果它指向的記憶體沒有使用許可權,程式就崩潰了。對於暫時沒有指向的指標,建議賦值null
。
兩個指標變數可以相減。如果兩個指標變數指向同乙個陣列中的某個元素,那麼相減的結果就是兩個指標之間相差的元素個數。
陣列也是有型別的,如int[4]、和int[5]就是2中不同的陣列型別,使用前者宣告的變數佔4個int大小,使用後者宣告的變數佔5個int大小。
陣列名的本意是表示一組型別相同的資料。在定義陣列時,或者和 sizeof、& 運算子一起使用時陣列名才表示整個陣列,在其他表示式中的陣列名會被轉換為乙個指向陣列首位址的指標。
指向函式的指標 函式指標
如果在程式中定義了乙個函式,在編譯時,編譯系統為函式 分配一段儲存空間,這段儲存空間的起始 又稱入口 位址 稱為這個函式的指標。指標即是位址 我們定義乙個指標變數,這個指標變數指向乙個整型資料變數的位址,我們稱指向乙個整型資料的指標變數 那麼它指向乙個函式的位址,稱為指向乙個函式的指標變數。形如 i...
函式指標 指標函式 指標的指標 指向指標陣列的指標
一 在學習arm過程中發現這 指標函式 與 函式指標 容易搞錯,所以今天,我自己想一次把它搞清楚,找了一些資料,首先它們之間的定義 1 指標函式是指帶指標的函式,即本質是乙個函式。函式返回型別是某一型別的指標 型別識別符號 函式名 參數列 int f x y 首先它是乙個函式,只不過這個函式的返回值...
指向函式的指標,指向函式的指標作為函式引數
1.基本法 include pragma warning disable 4996 pragma warning disable 4715 指向函式的指標作為函式的引數 有兩個整數a,b,讓使用者輸入1,2或者3,當輸入1時,給出相對大值,當輸入2時,給出相對小值,當輸入3時,給出兩者之和 1.可以...