c語言怎樣用指針調(diào)用函數(shù) c語言如何用指針調(diào)用函數(shù)

C語言指針、函數(shù)調(diào)用及反序函數(shù)使用

#?include?stdio.h

云安網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),云安網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為云安上千多家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營銷網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的云安做網(wǎng)站的公司定做!

void?Input(int?*?a,?int?n);

void?Onput(int?*?a,?int?n);

void?Fun(int?*?a,?int?n)

int?main()

{

int?n?=?0;

printf("輸入數(shù)組個數(shù):");

scanf_s("%d",?n);

int?a[n];

Input(a,n);

printf("處理前:\n");

Output(a,?n);

Fun(a,?n);

printf("處理后:\n");

Output(a,?n);

}

void?Input(int?*?a,?int?n)

{

for(int?i?=?0;?i??n;?i++)

{

scanf("%d",?a[i]);

}

}

void?Output(int?*?a,?int?n)

{

for?(int?i?=?0;?i??n;?i++)

{

printf("%d\t",?a[i]);

}

}

void?Fun(int?*?a,?int?n)

{

int?temp;

for(int?i?=?0;?i??n/2,?i++)

{

temp?=?a[i];

a[i]?=?a[n-1-i];

a[n-1-i]?=?temp;

}

}

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

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

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

void func( int a )

{

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

}

此時,定義了一個函數(shù)名是func的函數(shù)。可以如下調(diào)用該函數(shù):

func(100);

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

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

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

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

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

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

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

(1) 使用指針降級運算符*來定義,表示這個是一個指針。

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

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

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

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

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

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

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

下面根據(jù)程序測試例子來看看怎么樣應(yīng)用函數(shù)指針變量。

深入學(xué)習,可以交個朋友,工人人人號:韋凱峰linux編程學(xué)堂

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

深入學(xué)習,可以交個朋友,工人人人號:韋凱峰linux編程學(xué)堂

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

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

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

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

如下是一個測試例子:

深入學(xué)習,可以交個朋友,工人人人號:韋凱峰linux編程學(xué)堂

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

深入學(xué)習,可以交個朋友,工人人人號:韋凱峰linux編程學(xué)堂

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

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

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

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

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

int func( void );

int (*pfunc)( void );

pfunc = func;

此時,定義func函數(shù),它的返回值類型是int類型,形參列表是void,那么,定義pfunc函數(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);

我們再總結(jié)一下:

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

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

C語言 怎么調(diào)用指針數(shù)組函數(shù)

1.函數(shù)指針的數(shù)組定義方法:返回值類型( * 指針變量名[Number]) (形參列表)。

例如:

double add(double a,double b){};

double sub(double a,double b){};

double mul(double a,double b){};

double div1(double a,double b){};

double (*oper_func[])(double, double) = {add,sub,mul,div1};//函數(shù)指針的數(shù)組定義

2.函數(shù)指針是指向函數(shù)的指針變量。 因而“函數(shù)指針”本身首先應(yīng)是指針變量,只不過該指針變量指向函數(shù)。這正如用指針變量可指向整型變量、字符型、數(shù)組一樣,這里是指向函數(shù)。C在編譯時,每一個函數(shù)都有一個入口地址,該入口地址就是函數(shù)指針所指向的地址。有了指向函數(shù)的指針變量后,可用該指針變量調(diào)用函數(shù),就如同用指針變量可引用其他類型變量一樣,在這些概念上是大體一致的。函數(shù)指針有兩個用途:調(diào)用函數(shù)和做函數(shù)的參數(shù)。

3.函數(shù)指針的聲明方法為:

返回值類型( * 指針變量名) (形參列表);

“返回值類型”說明函數(shù)的返回類型,“( * 指針變量名)”中的括號不能省,括號改變了運算符的優(yōu)先級。若省略整體則成為一個函數(shù)說明,說明了一個返回的數(shù)據(jù)類型是指針的函數(shù),后面的“形參列表”表示指針變量指向的函數(shù)所帶的參數(shù)列表。例如:

int func(int x); /* 聲明一個函數(shù) */

int (*f) (int x); /* 聲明一個函數(shù)指針 */

f = func; /* 將func函數(shù)的首地址賦給指針f */

或者使用下面的方法將函數(shù)地址賦給函數(shù)指針:

f = func;

賦值時函數(shù)func不帶括號,也不帶參數(shù),由于func代表函數(shù)的首地址,因此經(jīng)過賦值以后,指針f就指向函數(shù)func(x)的代碼的首地址。

例子:

#includestdio.h

int?max(int?x,int?y){return?(xy??x:y);}

int?main(){

int?(*ptr)(int,?int);

int?a,?b,?c;

ptr?=?max;

scanf("%d%d",?a,?b);

c?=?(*ptr)(a,b);

printf("a=%d,?b=%d,?max=%d",?a,?b,?c);

return?0;

}

c語言:關(guān)于指向函數(shù)的指針編程

#include?stdio.h

#include?stdlib.h

#include?string.h

void?virtualFun(int?choice,?int?n,?char?*str[],?char?*(*p)(int?,?char?**));

char?*maxs(int?n,?char?*s[]);??//此函數(shù)通過指向函數(shù)的指針調(diào)用

char?*mins(int?n,?char?*s[]);??//此函數(shù)通過指向函數(shù)的指針調(diào)用

char?*minc(int?n,char?*s[]);???//此函數(shù)通過指向函數(shù)的指針調(diào)用

void?Menu();

char?*(*func)(int?n,?char?**);

int?main()?{

char?*name[]={"FOLLOW?ME","BASIC","GREAT?WALL?","FORTRAN","COMPUTER?DESIGN"};

int?n=5;

char?ch=0;

while?(ch!=4)?{

Menu();

ch?=?getchar();

getchar();//ignore?'\n'

ch?=?ch?-?'0';

virtualFun(ch,?n,?name,?func);

}

return?0;

}

void?virtualFun(int?choice,?int?n,?char?*str[],?char?*(*p)(int?n,?char?**name))?{

switch(choice)?{

case?1:?//max?string

p?=?maxs;

break;

case?2:

p?=?mins;

break;

case?3:

p?=?minc;

printf("[result?is?:%c]\n",?*p(n,?str));?//because?the?return?is?a?char

default:

return;

}

printf("[result?is?:%s]\n",?p(n,?str));

}

char?*maxs(int?n,?char?*s[])?{

int?i;

char?*max?=?s[0];

for?(i=1;in;i++)?{

if?(strcmp(max,?s[i])0)

max?=?s[i];

}

return?max;

}

char?*mins(int?n,?char?*s[])?{

int?i;

char?*min?=?s[0];

for?(i=1;in;i++)?{

if?(strcmp(min,?s[i])0)

min?=?s[i];

}

return?min;

}

char?*minc(int?n,?char?*s[])?{

int?i;

char?ch?=?s[0][0],?*p,?*r=s[0];

for?(i=0;in;i++)?{

p?=?s[i];

while(*p++)?{

if?(*p0x20??ch*p)?{

ch?=?*p;

r?=?p;

}

}

}

return?r;

}

void?Menu()?{

char?menu[]?=?"1??max?string\n\

2??min?string\n\

3??min?char?\n\

4??exit\n";

printf("%s",?menu);

}

C語言函數(shù)指針調(diào)用

void point(char *p){ p+=3; } //加上void比較好

char b[4]={'a','b','c','d'}, *p=b; //寫在同一行,p是char*的

point(p);// 這里傳遞的是指針,在函數(shù)里面改指針是“臨時變量”,不是局部變量

//臨時對象不會被記錄,如果改p指向的內(nèi)存就可以被記錄。

printf("%c\n", *p); // 輸出結(jié)果為a,因為p是扔指向b[]其實位置

答案為a

網(wǎng)站題目:c語言怎樣用指針調(diào)用函數(shù) c語言如何用指針調(diào)用函數(shù)
網(wǎng)頁網(wǎng)址:http://muchs.cn/article32/hjsgpc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計公司域名注冊、面包屑導(dǎo)航、網(wǎng)站內(nèi)鏈、軟件開發(fā)、網(wǎng)站收錄

廣告

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

綿陽服務(wù)器托管