c語言函數(shù)定義指針 c語言中指針的定義

C語言函數(shù)指針,敲黑白,講重點(diǎn),如何定義函數(shù)指針?

學(xué)習(xí)了數(shù)組之后,我們知道數(shù)組是在內(nèi)存中申請(qǐng)一塊內(nèi)存空間;數(shù)組名代表內(nèi)存塊的首地址,通過數(shù)組名可以訪問內(nèi)存塊中的數(shù)據(jù)。

在相城等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供做網(wǎng)站、成都網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作按需開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),成都營銷網(wǎng)站建設(shè),外貿(mào)網(wǎng)站制作,相城網(wǎng)站建設(shè)費(fèi)用合理。

那么,對(duì)于函數(shù),它也是存放在內(nèi)存塊中的一段數(shù)據(jù)。例如下面的函數(shù):

void func( int a )

{

printf( "in func, a = %d " , a );

}

此時(shí),定義了一個(gè)函數(shù)名是func的函數(shù)??梢匀缦抡{(diào)用該函數(shù):

func(100);

此時(shí),就進(jìn)入了func函數(shù)的函數(shù)體中執(zhí)行??梢钥吹?, 函數(shù)名如同數(shù)組名一樣,代表函數(shù)所在內(nèi)存塊的首地址 。通過數(shù)組名可以訪問數(shù)組在內(nèi)存塊中申請(qǐng)的內(nèi)存,同理,通過函數(shù)名,可以訪問函數(shù)在內(nèi)存中存放的數(shù)據(jù)。

所以,函數(shù)名就代表了該函數(shù)在內(nèi)存塊中存放的首地址。那么,函數(shù)名是表示一個(gè)地址,就可以把這個(gè)地址值存放在某一個(gè)指針變量中,然后,通過指針變量訪問函數(shù)名指向的函數(shù)。

在C語言中,提供了函數(shù)指針變量,可以存放函數(shù)名表示的地址。函數(shù)指針變量的定義格式如下:

返回?cái)?shù)據(jù)類型 (*函數(shù)指針變量名)(形參列表)

對(duì)比函數(shù)的定義如下:

返回?cái)?shù)據(jù)類型 函數(shù)名(形參列表)

可以看到,函數(shù)指針變量的定義,與函數(shù)的定義格式基本一樣,唯一的區(qū)別是把“函數(shù)名”轉(zhuǎn)換為“*(函數(shù)指針變量名)”;總結(jié)如下:

(1) 使用指針降級(jí)運(yùn)算符*來定義,表示這個(gè)是一個(gè)指針。

(2) 指針降級(jí)運(yùn)算符*不可以靠近返回?cái)?shù)據(jù)類型,例如“返回?cái)?shù)據(jù)類*”就表示函數(shù)的返回類型是一個(gè)指針。那么,為了讓指針降級(jí)運(yùn)算符*能夠修飾函數(shù)指針變量,就用小括號(hào)()把指針降級(jí)運(yùn)算符*與函數(shù)指針變量名包含起來。

定義了函數(shù)指針變量之后,可以把函數(shù)名賦給函數(shù)指針變量。因?yàn)?,函?shù)名就表示函數(shù)在內(nèi)存塊中的首地址,所以,可以直接把一個(gè)地址賦值給函數(shù)指針變量。格式如下:

函數(shù)指針變量 = 函數(shù)名;

最終,可以通過函數(shù)指針變量調(diào)用函數(shù),調(diào)用的格式與通過函數(shù)名調(diào)用完全一樣,通過函數(shù)指針變量調(diào)用函數(shù),有如下形式:

方法1:函數(shù)指針變量(實(shí)參列表);

方法2:(*函數(shù)指針變量名)(實(shí)參列表);

很多情況下,我們更傾向于使用第一種形式,因?yàn)?,它的使用方式更接近于通過函數(shù)名調(diào)用函數(shù)。

下面根據(jù)程序測(cè)試?yán)觼砜纯丛趺礃討?yīng)用函數(shù)指針變量。

深入學(xué)習(xí),可以交個(gè)朋友,工人人人號(hào):韋凱峰linux編程學(xué)堂

程序運(yùn)行結(jié)果如下:

深入學(xué)習(xí),可以交個(gè)朋友,工人人人號(hào):韋凱峰linux編程學(xué)堂

可以看到,我們定義了func函數(shù)和函數(shù)指針變量pfunc,然后,把函數(shù)名func設(shè)置給函數(shù)指針變量pfunc,最終,通過函數(shù)指針變量pfunc調(diào)用函數(shù)。

因?yàn)楹瘮?shù)指針變量存放的就是函數(shù)名表示的地址,所以,函數(shù)指針變量與函數(shù)名一樣,可以直接通過函數(shù)指針變量調(diào)用函數(shù)。

注意:我們?cè)趯W(xué)習(xí)指針的時(shí)候,可以把一個(gè)int類型的變量地址賦值給int類型的指針;但是,不可以把int類型變量的地址,賦值給double類型的指針。這就是變量數(shù)據(jù)類型不一致的問題。

同樣的道理,定義函數(shù)的時(shí)候,函數(shù)的返回?cái)?shù)據(jù)類型和形參列表都不一樣,所以,函數(shù)指針變量能夠接收的函數(shù)名,它們定義的 函數(shù)返回?cái)?shù)據(jù)類型和形參列表必須一致 ,此時(shí),就如同變量與指針變量類型一致時(shí),才可以把變量的地址賦值給指針變量一樣。

如下是一個(gè)測(cè)試?yán)樱?/p>

深入學(xué)習(xí),可以交個(gè)朋友,工人人人號(hào):韋凱峰linux編程學(xué)堂

程序編譯結(jié)果如下:

深入學(xué)習(xí),可以交個(gè)朋友,工人人人號(hào):韋凱峰linux編程學(xué)堂

可以看到,我們把func函數(shù)的形參列表修改為double,但是,函數(shù)指針變量pfunc定義的形參列表為int類型,此時(shí),函數(shù)和函數(shù)指針變量的定義格式不一致,所以,不可以把函數(shù)名表示的地址設(shè)置給函數(shù)指針變量。我們來總結(jié)一下:

(1) 在Ubuntu系統(tǒng)中,使用GCC編譯,提示warning警告,但是,程序可以編譯通過,可以運(yùn)行。

(2) 在Windows系統(tǒng)中,使用Visual Studio工具,無法編譯該代碼,提示類型不一致。

(3) 從代碼的嚴(yán)謹(jǐn)方面來說,是不可以設(shè)置類型不一致的數(shù)據(jù)。所以,我們應(yīng)該編寫嚴(yán)謹(jǐn)?shù)拇a,函數(shù)定義的類型,與函數(shù)指針類型不一致的時(shí)候,不可以把函數(shù)名,賦值給函數(shù)指針變量。

函數(shù)指針變量的定義很重要,我們需要牢記和理解它們使用的方式。下面多舉幾個(gè)例子說明函數(shù)指針變量的定義和使用。

int func( void );

int (*pfunc)( void );

pfunc = func;

此時(shí),定義func函數(shù),它的返回值類型是int類型,形參列表是void,那么,定義pfunc函數(shù)指針變量的時(shí)候,它的返回值類型與形參列表都必須與func一樣。

char * func1( int x, int y, int x);

char * (*pfunc1)( int , int , int );

pfunc1 = func1;

char * (*pfunc1)( int x, int y, int x);

我們?cè)倏偨Y(jié)一下:

(1) 函數(shù)名表示函數(shù)在內(nèi)存塊中的首地址,可以直接把函數(shù)名賦值給函數(shù)指針變量;

(2) 定義函數(shù)指針變量的時(shí)候,函數(shù)返回?cái)?shù)據(jù)類型和形參列表必須與要指向函數(shù)的定義一致;

C語言函數(shù)指針定義

在最上面加一句這樣的定義

typedef void*(*pFn)();

pFn可以這樣理解:首先pFn是一個(gè)指針,指針指向一個(gè)函數(shù)(或者說pFn是一個(gè)函數(shù)指針),此函數(shù)返回一個(gè)無類型的指針。最終定義的變量及函數(shù)都是指針罷了,不過是指針的類型不同。所以在編譯時(shí)會(huì)有警告,說指針類型不匹配。但對(duì)于程序來講,都是可以在特定的上下文中使用的。

運(yùn)行結(jié)果是

t1,t2交替出現(xiàn)。

其實(shí)void也可以換為其它的類型如int, double等

又想到一個(gè)很好的辦法:

這次編譯不會(huì)有警告,運(yùn)行也不會(huì)出錯(cuò)。

示例代碼如下所示

#include stdio.h

long t1();

long t2();

int main()

{

long(*fn)()= (long (*)()) t1 ;

while(1){

fn = (long (*)()) fn();

}

}

long t1()

{

printf("t1\n");

return (long)t2 ;

}

long t2()

{

printf("t2\n");

return (long)t1 ;

}

C語言指針基本概念及其指針變量的定義是什么

語言中,指針是一種類型,被稱為“指針類型”。指針類型描述的是一個(gè)地址,這個(gè)地址指向內(nèi)存中另外一個(gè)對(duì)象的位置。簡單地說,指針表示的是它所指向?qū)ο蟮牡刂贰?/p>

1、比較point,*point,point三者的區(qū)別

對(duì)于int * point;

point:是指針變量,其內(nèi)容是地址量。

*point:是指針變量的目標(biāo)變量,即指針指向的那個(gè)變量,其內(nèi)容是數(shù)據(jù)。

point:是指指針變量本身所占據(jù)的存儲(chǔ)地址。

2、指針與數(shù)組

用指針和數(shù)組名在訪問內(nèi)存中的數(shù)據(jù)時(shí),他們的表現(xiàn)形式是等價(jià)的,因?yàn)樗麄兌际堑刂妨俊?/p>

數(shù)組名表示整個(gè)數(shù)組的首地址,可以看作是固定地址的指針,不能被賦值。

數(shù)組名無須賦初值,而指針在使用前必須賦初值。

3、字符指針和字符串

字符串是一個(gè)字符數(shù)組,字符串以‘\0’結(jié)束。printf函數(shù)的%s格式輸出字符時(shí),是從給定的地址開始,到遇上第一個(gè)‘\0’字符時(shí)結(jié)束。

對(duì)字符指針初始化,是將字符串的首地址賦給指針。

4、指針型函數(shù)

所謂指針型函數(shù),即返回值是指針(地址)的函數(shù)。

5、多級(jí)指針

指向指針的指針(**p)就是二級(jí)指針,指向指針的指針的指針(***p)是3級(jí)指針。

多級(jí)指針類似于間接尋址。

6、指向函數(shù)的指針

C語言中的函數(shù)名表示函數(shù)的首地址,即函數(shù)執(zhí)行的人口地址。

定義形式:[存儲(chǔ)類型][數(shù)據(jù)類型標(biāo)示符](*指向函數(shù)的指針變量名)();

例子: int(*fun)();//指向函數(shù)的指針 , int * fun(); //指針型函數(shù),注意(* fun)括號(hào)不能少

7、動(dòng)態(tài)指針

當(dāng)需要一大片內(nèi)存的時(shí)候,最好使用動(dòng)態(tài)分配。

使用malloc函數(shù):void * malloc(size_t size)。

例子:

int * pn=malloc(10*sizeof(int));

double *pd=malloc(10*sizeof(double));

c語言如何定義一個(gè)指向指針函數(shù)的函數(shù)指針

void*?f(int);?//一個(gè)指針函數(shù)f

void*(*p)(int)?=?f;?//一個(gè)指向f的函數(shù)指針p

C語言指針變量定義?

根據(jù)你的定義,使用LinkList定義的變量是指針變量,而加上*即LinkList *C表示的是指向指針的指針,表示二級(jí)指針變量。

你的合并函數(shù)是一個(gè)沒有返回值的函數(shù),所以你在函數(shù)體內(nèi)更改C要達(dá)到更改實(shí)參的效果,你必須傳入實(shí)參的地址。

如果是一級(jí)指針,C接收實(shí)參指向的對(duì)象地址,如果此時(shí)在函數(shù)體內(nèi)對(duì)C進(jìn)行賦值,只是改變了函數(shù)體內(nèi)C的指向,實(shí)參還是指向原來的地址。函數(shù)內(nèi)是改變不了實(shí)參C本身的指向,只有傳入實(shí)參C變量本身的地址,那么形參就要定義指向指針的變量來接收實(shí)參。

以上是一種方法,另外一種方法就是通過函數(shù)返回值,返回新合并的鏈表的頭。那函數(shù)類型就可以改為:

LinkList MergeList(LinkList a, LinkList b)。

這可以多練習(xí)好好理解一下。

C語言-函數(shù)指針

/*

函數(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,指針的*和名字,要用小括號(hào)括起來//不括起來就是指針函數(shù)了,意思就變成,函數(shù)返回一個(gè)指針了

3,最右邊的小括號(hào)里形參位置的類型,形參的個(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;

}

名稱欄目:c語言函數(shù)定義指針 c語言中指針的定義
地址分享:http://muchs.cn/article38/doocdsp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈微信小程序、手機(jī)網(wǎng)站建設(shè)、域名注冊(cè)、網(wǎng)站策劃、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)