前言
當學習數組指針與指針數組的時候很是讓人頭疼,到底是數組還是指針?深入學習到函數的時候發現既然有函數指針與指針函數這麼個更讓人頭疼的難以區分的問題。當去看一眼定義的時候,噼裏啪啦一串又長又繞,真讓人崩潰!好不容易記住了結果沒過幾天就又忘記了,那麼今天你看的這篇文章就能理解並區別兩者。
函數指針
定義
簡單的來說,其本質是一個指針,而該指針指向一個函數。總結來說就是:指向函數的指針
函數指針的聲明
int (*fun)(int x,int y);
//該函數指針fun是一個指向返回值爲整型,有兩個參數並且兩個參數的類型都是整型的函數
當然函數指針其本質既然是一個指針,那麼賦值自然要把一個函數的地址賦值給它,有兩種寫法:
fun = &max;
fun = max;
很多小夥伴想這爲什麼不加取地址符(&)也可以?其實是每個函數的函數名就是該函數的入口地址
實例說明
//求兩個整數的較大值和較小值
#include <stdio.h>
int max(int a, int b) {
return a > b ? a : b;
}
int min(int a, int b) {
return a < b ? a : b;
}
int (*fun)(int m, int n);//聲明一個函數指針,該指針指向返回值爲int型,有兩個參數都是int的函數
int main()
{
int e,f;
printf("請輸入兩個數:");
scanf("%d %d",&e,&f);
fun = &max;//函數指針指向較大值函數max
int c = (*fun)(e, f);
printf("較大的數值是: %d \n", c);
fun = min;
c = fun(e, f);//函數指針指向較小值min
printf("較小的數值是: %d \n", c);
return 0;
}
運行結果如下:
這裏值得注意的是將一個函數賦值給函數指針時可以不加取地址符(&),同時調用函數指針也有兩種不同的方式:
c = fun(e, f);
c = (*fun)(e, f);
指針函數
定義
簡單的來講就是一個返回值是一個指針的函數,其本質是一個函數,而該函數的返回值是一個指針
指針函數的聲明
int *fun(int a, int b); // 返回值爲int *,指針類型的返回值
當然上述聲明也可以寫成以下形式:
int* f(int a, int b);
讓指針標誌 * 與int緊貼在一起,而與函數名fun間隔開,這樣看起來就明瞭些了,fun是函數名,返回值類型是一個int類型的指針。指針函數就是返回一個地址給調用者。
實例說明:
#include <stdio.h>
#include <stdlib.h>
int* fun(int a,int b)//聲明一個指針函數
{
int *p = (int *)malloc(sizeof(int));
printf("P的地址爲:0x%x \n", p);
if(a>b)
*p=a;
else
*p=b;
printf("*p = %d \n", *p);
return p;
}
int main()
{
int m,n,*q;
printf("q的地址爲:0x%x\n",q);
printf("請輸入兩個數:");
scanf("%d %d",&m,&n);
q=fun(m,n);//調用函數指針,得到較大值的地址
printf("q的地址爲:0x%x\n",q);
printf("較大值是:%d",*q);
return 0;
}
運行結果如下:
通過函數指針得到一個指向較大值的指針,也就是地址。將該地址給調用者(q),最終得到較大值。
兩者區別總結
類別 | 主體 | 作用 | 定義 |
---|---|---|---|
指針函數 | 函數 | 返回一個指針 | int* fun(int x,int y) |
函數指針 | 指針 | 指向一個函數 | int (*fun)(int x,int y); |
或許記住會比較麻煩,可以這樣記。括號的優先級高於星號(*),當括號裏有星號時就是一個函數指針,沒有則是一個指針函數,或者名字誰在後就是誰的本體(指針函數的本體是函數)當然想要深入瞭解還是得自己實踐自己總結!
最後如果文章對你有幫助,請送我一個免費的讚唄!