函數(shù)指針
顧名思義函數(shù)指針就是指向函數(shù)的指針,這個指針是指向一個函數(shù)地址篓足,我們在定義函數(shù)的時候也會像變量一樣鸟缕,有一個內存地址晶框,但不同于變量,變量存儲的是固定的值叁扫,而函數(shù)存儲的是函數(shù)的內在地址三妈。通過函數(shù)指針可實現(xiàn)Java多態(tài)的效果。讓我們體驗一下函數(shù)指針吧莫绣!
void funcPoint1(){
printf("這里是函數(shù)1:%d\n",333);
}
void funcPoint2(int i){
printf("這里是函數(shù)2:%d\n", i);
}
void main(){
//函數(shù)指針的定義畴蒲,返回值(*函數(shù)指針名稱)(函數(shù)參數(shù))=&函數(shù)名稱
//無參指針函數(shù)
void(*funcP1)() = &funcPoint1;
//有參數(shù)的指針函數(shù)
void(*funcP2)(int) = &funcPoint2;
//調用函數(shù)指針
funcP1();
funcP2(3);
printf("函數(shù)1指針地址:%#x\n", funcP1);
printf("函數(shù)2指針地址:%#x\n", funcP2);
system("pause");
}
輸出:
這里是函數(shù)1:333
這里是函數(shù)2:3
函數(shù)1指針地址:0x12a1050
函數(shù)2指針地址:0x12a1055
int add(int n1,int n2){
return n1 + n2;
}
int minus(int n1,int n2){
return n1 - n2;
}
//我們可以函數(shù)指針作為函數(shù)參數(shù)傳入,實現(xiàn)java中的多態(tài)
void addOrMinus( int (*f)(int,int),int a,int b){
int c = f(a,b);
printf("計算出來的值為:%d\n",c);
}
void main(){
addOrMinus(add,3,4);
addOrMinus(minus,99,3);
system("pause");
}
輸出:
計算出來的值為:7
計算出來的值為:96
通過傳函數(shù)地址对室,就可以調用該函數(shù)進行操作模燥,在Android開發(fā)中經(jīng)常會用到網(wǎng)絡數(shù)據(jù)的回調,NetCallBack功能掩宜,那么C中就可以應用函數(shù)指針進行實現(xiàn)如:
#include <windows.h>//這里需要引入線程休眠頭文件
/*
*網(wǎng)絡請求數(shù)據(jù)
*/
void netRequest(char* url,void(*callBack)(char*)){
printf("請求地址:%s\n",url);
Sleep(2000);
callBack("服務端的數(shù)據(jù)");
}
/*
*回調函數(shù)
*/
void callBack(char* netResult){
printf("網(wǎng)絡請求回調函數(shù)\n");
printf("來自服務端的數(shù)據(jù):%s\n",netResult);
system("pause");
}
void main(){
char* url = "www.baidu.com";
netRequest(url,callBack);
}
輸出:
請求地址:wwww.baidu.com
網(wǎng)絡請求回調函數(shù)
來自服務端的數(shù)據(jù):服務端的數(shù)據(jù)
二級指針
說白了就是指向指針的指針
void main(){
int i = 100;
//定義p指針變量(該p指針本身也是一個內存地址)存儲的是i的內存地址
int * p = &i;
//定義pp指針變量存儲的是p指針的地址
int **pp = &p;
//*p與的差別:p是一個地址蔫骂,*p是p取地址的值.
printf("指針地址:%d\n",*p);
printf("指針地址:%#x\n",&p);
printf("指向指針的地址:%#x\n",&pp);
printf("修改之前的值為:%d\n",**pp);
//多級指針就是要往上一級一級的找,然后通過*來操作內存空間
**pp = 30;
printf("修改之后的值為:%d\n",**pp);
system("pause");
}
輸出:
指針地址:0x30f788
指向指針的地址:0x30f77c
修改之前的值為:100
修改之后的值為:30
指針是操作內存的神器牺汤,二級指針辽旋,不管是幾級指針只要記住里面存儲的是上級指針的地址。
指針運算
void main(){
int ids[] = { 56, 89, 56, 33, 15 };
//數(shù)組變量名:ids就是數(shù)組的首地址
printf("%#x\n",ids);
printf("%#x\n", &ids);
printf("%#x\n", &ids[0]);
//以上三個都是同一個地址
//指針變量
int *p = ids;
printf("%d\n",*p);//取第一個值
//指針的加法
p++;
printf("%d\n", *p);//取第二個值
p = p + 2;//取第三個的值33
printf("%d\n", *p);
system("pause");
}
函數(shù)指針的內存分配
那么指針為什么要有類型,它與地址有什么差別:
- 地址只是開始的位置