/*
成都創(chuàng)新互聯(lián)長期為數(shù)千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為忻城企業(yè)提供專業(yè)的做網(wǎng)站、網(wǎng)站設(shè)計(jì),忻城網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
函數(shù)指針,關(guān)鍵是后面兩個(gè)字“指針”,顧名思義,是一個(gè)指向函數(shù)的指針
原理:函數(shù)在創(chuàng)建好了后,函數(shù)的代碼會(huì)在內(nèi)存中占有個(gè)位置,這時(shí)我們創(chuàng)造一個(gè)指針來指向這個(gè)地址,這個(gè)指針就叫函數(shù)指針
函數(shù)指針不可以移動(dòng),想要移動(dòng)指針的位置來指向函數(shù)的下一個(gè)指令的想法是錯(cuò)誤的
函數(shù)指針的要求,
1,首先這個(gè)指針,要和函數(shù)的返回類型一樣
2,指針的*和名字,要用小括號括起來//不括起來就是指針函數(shù)了,意思就變成,函數(shù)返回一個(gè)指針了
3,最右邊的小括號里形參位置的類型,形參的個(gè)數(shù),也要和函數(shù)定義時(shí)的形參一致,只要類型,不要形參名即可,
但是加上形參名也可以,沒毛病,看上去也更清晰
*/
#include
void swapchar(char *a, char *b)
{
char t;
t = *a;
*a = *b;
*b = t;
}
void swapchar2(char * a2, char * b2)
{
printf("this is swapchar2");
}
int main(void)
{
char chf = 'a', chg = 'j';
void(*p)(char * a, char * b);//定義函數(shù)指針、形參名字a、b可有可無,但有的話看上去更清晰,只要函數(shù)定義的類型、參數(shù)類型、以及參數(shù)個(gè)數(shù),與這個(gè)指針一致,那么這個(gè)指針p,就可以指向它
p = swapchar;//p指針接管swapchar函數(shù),只要給函數(shù)名字,就可以給過去了
printf("chf=%c,chg=%c ", chf, chg);
p(chf, chg);
printf("chf=%c,chg=%c ", chf, chg);
p = swapchar2;//這里把swapchar2函數(shù)的地址,給了p,這時(shí)p從swapchar地址,轉(zhuǎn)移到了swapchar2這里。
p(chf,chg);
return 0;
}
1、使用場景
使用指針時(shí),必須將它指向一個(gè)變量的地址或者為它分配空間方能使用,如下所示:
#includestdio.h
#include stdlib.h
int main(int argc, char const *argv[])
{
int a[5]={0,1,2,3,4};
int *b,*d;
int c=2;
int *e=a; //e指向a數(shù)組首地址
//*b=2;? ?無法直接初始化
//printf("%d\n", *b);
e=e+2;? //移動(dòng)兩個(gè)地址單元
d=c;? //d指向c的地址來表示值
c=4;? ?//修改原c變量的值,d指針的值會(huì)發(fā)生改變
b=(int *)malloc(sizeof(int));//為b分配一個(gè)int型空間來直接存儲(chǔ)值
*b=2;//分配空間后可以直接賦值了
printf("this is e,b,c,d :%d %d %d %d\n",*e,*b,c,*d);
2、類型說明
(1)int *a :表示一個(gè)指向int型變量的指針,指向的是變量的地址單元
(2)char *b:表示一個(gè)指向char變量的指針
*a表示的是這個(gè)指針指向地址的值,a為此指針本身的地址,這點(diǎn)要明確,一般用*(a+1)、*(a+2)來表示值,如:
int nums[5]={0,1,2,3,4};
int *a=nums;
printf("%d %d %p\n",*a,*(a+1),a);
擴(kuò)展資料:
指針的運(yùn)算
指針指向變量地址,若原變量的內(nèi)容發(fā)生了變化,它本身也會(huì)發(fā)生變化,指針之間的運(yùn)算一般為值運(yùn)算和地址運(yùn)算
(1)值運(yùn)算:直接通過*運(yùn)算方式,像a+*(a+1),結(jié)果為第一個(gè)元素與第二個(gè)元素相加。
int nums[5]={0,1,2,3,4};
int *a=nums;
(2)地址運(yùn)算:通過a+i的方式.指針會(huì)指向a的下i個(gè)地址。
int nums[5]={0,1,2,3,4};
int *a=nums;
a=a+2;
printf("%d\n",*a);
結(jié)果輸出2。
參考資料來源 :指針-百度百科
有函數(shù): int fun(int a,int b);
要定義指向該函數(shù)的指針
對比指向 int a; 的指針
int *p; p = a;
p的定義是怎么來的?
首先要保證p是一個(gè)指針類型
寫下(*p),
然后,考慮下p的基類型,
p的基類型就是變量a的類型int
將int 放在(*p)前面就行了
int (*p);
括號可以省略,就成了 int *p;
同理
想要實(shí)現(xiàn) pf = fun;
(*pf) 將pf定義為一個(gè)指針,
將fun的類型作為pf的基類型
fun相當(dāng)于一個(gè) int (int a,int b)類型的量
int (int a,int b) (*pf);
基類型中有圓括號和中括號要后移
int (*pf)(int a,int b) ;//括號不能省略
pf = fun;
調(diào)用時(shí)
(*pf)(3,4); pf(3,4)都可以
C語言中函數(shù)指針與普通指針沒什么差別,只是指向的內(nèi)容不同而已。主要作用:
1、實(shí)現(xiàn)面向?qū)ο缶幊讨械亩鄳B(tài)性。
2、回調(diào)函數(shù)。
函數(shù)指針是指向函數(shù)的指針變量。因此“函數(shù)指針”本身首先應(yīng)是指針變量,只不過該指針變量指向函數(shù)。這正如用指針變量可指向整型變量、字符型、數(shù)組一樣,這里是指向函數(shù)。
C在編譯時(shí),每一個(gè)函數(shù)都有一個(gè)入口地址,該入口地址就是函數(shù)指針?biāo)赶虻牡刂?。有了指向函?shù)的指針變量后,可用該指針變量調(diào)用函數(shù),就如同用指針變量可引用其他類型變量一樣,在這些概念上是大體一致的。
函數(shù)指針有兩個(gè)用途:調(diào)用函數(shù)和做函數(shù)的參數(shù)。
標(biāo)題名稱:c語言指針在函數(shù)間用法 在c語言中,指針在函數(shù)中是如何使用的
路徑分享:http://chinadenli.net/article22/dogspjc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、面包屑導(dǎo)航、商城網(wǎng)站、品牌網(wǎng)站制作、建站公司、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)