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

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

1樓:匿名使用者

函式在記憶體中有一個物理位置,而這個位置是可以賦給一個指標的。一零點函式的地址就是該函式的入口點。因此,函式指標可被用來呼叫一個函式。

函式的地址是用不帶任何括號或引數的函式名來得到的。(這很類似於陣列地址的得到方法,即,在只有陣列名而無下標是就得到陣列地址。)

怎樣說明一個函式指標變數呢 ?

為了說明一個變數 fn_pointer 的型別是"返回值為 int 的函式指標", 你可以使用下面的說明語句:

int (*fn_pointer) ();

為了讓編譯器能正確地解釋這句語句, *fn_pointer 必須用括號圍起來。若漏了這對括號, 則:

int *fn_pointer ();

的意思完全不同了。fn_pointer 將是一個函式名, 其返回值為 int 型別的指標。

2:函式指標變數

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

3:指標型函式

前面我們介紹過,所謂函式型別是指函式返回值的型別。 在c語言中允許一個函式的返回值是一個指標 ( 即地址 ) ,這種返回指標值的函式稱為指標型函式。

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

型別說明符 * 函式名 ( 形參表 )

其中函式名之前加了 "*" 號表明這是一個指標型函式,即返回值是一個指標。型別說明符表示了返回的指標值所指向的資料型別。

如:int *ap(int x,int y)

表示 ap 是一個返回指標值的指標型函式, 它返回的指標指向一個整型變數。下例中定義了一個指標型函式 day_name ,它的返回值指向一個字串。該函式中定義了一個靜態指標陣列 name 。

name 陣列初始化賦值為八個字串,分別表示各個星期名及出錯提示。形參 n 表示與星期名所對應的整數。在主函式中, 把輸入的整數 i 作為實參, 在 printf 語句中呼叫 day_name 函式並把 i 值傳送給形參 n 。

day_name 函式中的 return 語句包含一個條件表示式, n 值若大於 7 或小於 1 則把 name[0] 指標返回主函式輸出出錯提示字串 "illegal day" 。否則返回主函式輸出對應的星期名。主函式中的第 7 行是個條件語句,其語義是,如輸入為負數 (i<0) 則中止程式執行退出程式。

exit 是一個庫函式, exit(1) 表示發生錯誤後退出程式, exit(0) 表示正常退出。

應該特別注意的是函式指標變數和指標型函式這兩者在寫法和意義上的區別。如 int(*p)() 和 int *p() 是兩個完全不同的量。 int(*p)() 是一個變數說明,說明 p 是一個指向函式入口的指標變數,該函式的返回值是整型量, (*p) 的兩邊的括號不能少。

int *p() 則不是變數說明而是函式說明,說明 p 是一個指標型函式,其返回值是一個指向整型量的指標,*p 兩邊沒有括號。作為函式說明, 在括號內最好寫入形式引數,這樣便於與變數說明區別。 對於指標型函式定義,int *p() 只是函式頭部分,一般還應該有函式體部分。

main()

char *day_n

ame(int n)

;return((n<1||n>7) ? name[0] : name[n]);

}本程式是通過指標函式,輸入一個 1 ~ 7 之間的整數, 輸出對應的星期名。指標陣列的說明與使用一個陣列的元素值為指標則是指標陣列。指標陣列是一組有序的指標的集合。

指標陣列的所有元素都必須是具有相同儲存型別和指向相同資料型別的指標變數。

指標陣列說明的一般形式為: 型別說明符 * 陣列名 [ 陣列長度 ]

其中型別說明符為指標值所指向的變數的型別。例如: int *pa[3] 表示 pa 是一個指標陣列,它有三個陣列元素, 每個元素值都是一個指標,指向整型變數。

通常可用一個指標陣列來指向一個二維陣列。 指標陣列中的每個元素被賦予二維陣列每一行的首地址,因此也可理解為指向一個一維陣列。圖 6—6 表示了這種關係。

int a[3][3]=;

int *pa[3]=;

int *p=a[0];

main()

本例程式中, pa 是一個指標陣列,三個元素分別指向二維陣列 a 的各行。然後用迴圈語句輸出指定的陣列元素。其中 *a[i] 表示 i 行 0 列元素值; *(*(a+i)+i) 表示 i 行 i 列的元素值; *pa[i] 表示 i 行 0 列元素值;由於 p 與 a[0] 相同,故 p[i] 表示 0 行 i 列的值; *(p+i) 表示 0 行 i 列的值。

讀者可仔細領會元素值的各種不同的表示方法。 應該注意指標陣列和二維陣列指標變數的區別。 這兩者雖然都可用來表示二維陣列,但是其表示方法和意義是不同的

2樓:無法無天

函式名 是 程式在執行時, 函式所佔記憶體單元塊的 首地址 的別稱。

就像陣列一樣。

3樓:

直接給你舉個例子吧:

#include

int max(int a, int b)int main()

4樓:匿名使用者

記憶體地址用法就相當於快遞取件與送件時目的地。用法。。。

5樓:撒德塔念

*func()是一個指向函式的指標,它指向的是函式的入口地址,題目問的是返回值,返回的應該就是一個指標,由於前面寫了int

所以返回的是一個指向整型變數的指標~

c語言函式指標怎麼用?

6樓:長城知道

有函式: int fun(int a,int b);

要定義來指自向該函式的指標

對比指向 int a; 的指標

int *p; p = &a;

p的定義是怎麼來的?

首先要保證p是一個指標型別

寫下(*p),

然後,考慮下p的基型別,

p的基型別就是變數a的型別int

將int 放在(*p)前面就行了

int (*p);

括號可以省略,就成了 int *p;

同理想要實現 pf = &fun;

(*pf) 將pf定義為一個指標,

將fun的型別作為pf的基型別

fun相當於一個 int (int a,int b)型別的量int (int a,int b) (*pf);

基型別中有圓括號和中括號要後移

int (*pf)(int a,int b) ;//括號不能省略pf = &fun;

呼叫時(*pf)(3,4); pf(3,4)都可以

c語言中函式指標是什麼 有什麼用 舉個例項

7樓:風若遠去何人留

函式指標是指向函式的指標變數。 因而“函式指標”本身首先應是指標變數,只不過該指標變數指向函式。這正如用指標變數可指向整型變數、字元型、陣列一樣,這裡是指向函式。

函式指標有兩個用途:呼叫函式和做函式的引數。

函式指標的宣告方法為:

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

如:int func(int x); /* 宣告一個函式 */int (*f) (int x); /* 宣告一個函式指標 */f=func; /* 將func函式的首地址賦給指標f */f = &func;

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

下面的程式說明了函式指標呼叫函式的方法:

#include

int max(int x,int y)

int main()

8樓:寒寒家

比如c++中的快排函式qsort, 的最後一個函式就是函式指標 compare, 這個函式決定了排序是從小到大,還是從大到小

int (*compare)(void *a, void*b);

然後咱們定義下面兩個函式:

int ascending(void *a, void *b)

int descending(void *a, void *b)

在呼叫qsort(int a, n,sizeof(int), ascending);就是升序。

而qsort內部實現過程中,對於陣列元素之間的比較,都是使用的compare函式指標完成的。

從這個例子可以看出,函式指標,增加了**的靈活性和複用性(為了升序和降序,不用寫兩個版本的qsort)

c語言的函式指標舉個例子

9樓:劉文正粉絲

函式指標告訴cpu下一步需要執行**的**的指標, 一陣列十分相像.

#include

void function(int i, double d)    //一個函式的宣告

void anotherfunction(int i, double d)    //另外一個函式宣告

int main()

關於c語言指標呼叫函式,關於C語言中指向函式的指標的呼叫問題

第一條紅線是定義乙個函式指標 第二條紅線起強轉作用,把0xd010f0強轉為對應的函式指標型別 我寫的這個程式可以幫你理解.常量位址被printab取代 劃紅線的是宣告了乙個函式指標,這個函式的兩個引數和返回值都是int,然後將0xd 的位址強制轉換為函式啊 同下面類似 typedef int fu...

c語言中strtok用法,C語言中strtok用法

星月小木木 strtok函式會破壞被分解字串的完整,呼叫前和呼叫後的s已經不一樣了。如果要保持原字串的完整,可以使用strchr和sscanf的組合等。strtok是乙個執行緒不安全的函式,因為它使用了靜態分配的空間來儲存被分割的字串位置 執行緒安全的函式叫strtok r,ca。運用strtok來...

c語言中的標準函式有哪些,C語言中的標準函式有哪些

c語言輸入輸出函式有很多,標準i o函式中包含了如下幾個常用的函式 scanf,printf,getc,putc,getchar,putchar,gets,puts,fgets,fputs,fgetc,fputc,fscanf,fprintf等.int getc file fp getc主要是從檔案...