一、指針函數
int *f(int a, int b); // 返回值為int *,指針類型的返回值
上面的函數聲明又可以寫成如下形式:
int* f(int a, int b);
讓指針標志 * 與int緊貼在一起,而與函數名f間隔開,這樣看起來就明了些了,f是函數名,返回值類型是一個int類型的指針。
指針函數就是返回一個地址給調用者。
例1:
// 001.c
#include <stdio.h>
int *f(int a, int b); // 聲明指針函數
int main()
{
printf("------------------------------ Start\n");
int *p1 = NULL;
printf("The memeory address of p1 = 0x%x \n", p1);
p1 = f(1, 2);
printf("The memeory address of p1 = 0x%x \n", p1);
printf("*p1 = %d \n", *p1);
printf("------------------------------ End\n");
getchar();
return 0;
}
int *f(int a, int b)
{
int *p = (int *)malloc(sizeof(int));
printf("The memeory address of p = 0x%x \n", p);
memset(p, 0, sizeof(int));
*p = a + b;
printf("*p = %d \n", *p);
return p;
}
指針函數f返回的類型是一個指針類型,并且指針函數f的返回值p和f賦值給的指針p1的地址是相同的
二、函數指針
函數指針說的就是一個指針,但這個指針指向的是函數,不是普通的基本數據類型或者類對象。
int (*f)(int a, int b); // 聲明函數指針
// 該函數指針f是一個指向返回值為整型,有兩個參數并且兩個參數的類型都是整型的函數
函數指針與指針函數的最大區別是:函數指針的函數名是一個指針,即函數名前面有一個指針類型的標志型號“*”。
當然,函數指針的返回值也可以是指針。
例2:
// 002.c
// 求2個整數的較大值和較小值
#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 (*f)(int, int); // 聲明函數指針,該指針指向返回值類型為int,有兩個參數類型都是int的函數
int main()
{
printf("------------------------------ Start\n");
f = max; // 函數指針f指向求較大值的函數max
int c = (*f)(1, 2);
printf("The max value is %d \n", c);
f = min; // 函數指針f指向求最小值的函數min
c = (*f)(1, 2);
printf("The min value is %d \n", c);
printf("------------------------------ End\n");
getchar();
return 0;
}