c語言函數(shù)中指針 c語言函數(shù)指針和指針函數(shù)

C語言函數(shù)指針怎么用?

有函數(shù): int fun(int a,int b);\x0d\x0a要定義指向該函數(shù)的指針\x0d\x0a對比指向 int a; 的指針\x0d\x0aint *p; p = a;\x0d\x0ap的定義是怎么來的?\x0d\x0a首先要保證p是一個(gè)指針類型\x0d\x0a寫下(*p),\x0d\x0a然后,考慮下p的基類型,\x0d\x0ap的基類型就是變量a的類型int\x0d\x0a將int 放在(*p)前面就行了\x0d\x0aint (*p); \x0d\x0a括號可以省略,就成了 int *p;\x0d\x0a\x0d\x0a同理\x0d\x0a想要實(shí)現(xiàn) pf = fun;\x0d\x0a(*pf) 將pf定義為一個(gè)指針,\x0d\x0a將fun的類型作為pf的基類型\x0d\x0afun相當(dāng)于一個(gè) int (int a,int b)類型的量\x0d\x0aint (int a,int b) (*pf);\x0d\x0a基類型中有圓括號和中括號要后移\x0d\x0aint (*pf)(int a,int b) ;//括號不能省略\x0d\x0apf = fun;\x0d\x0a調(diào)用時(shí)\x0d\x0a(*pf)(3,4); pf(3,4)都可以

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

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

學(xué)習(xí)了數(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í),定義了一個(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)存塊中申請的內(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ù)指針變量名)(形參列表)

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

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

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

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

(2) 指針降級運(yùn)算符*不可以靠近返回?cái)?shù)據(jù)類型,例如“返回?cái)?shù)據(jù)類*”就表示函數(shù)的返回類型是一個(gè)指針。那么,為了讓指針降級運(yùn)算符*能夠修飾函數(shù)指針變量,就用小括號()把指針降級運(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ù)程序測試?yán)觼砜纯丛趺礃討?yīng)用函數(shù)指針變量。

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

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

深入學(xué)習(xí),可以交個(gè)朋友,工人人人號:韋凱峰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ù)。

注意:我們在學(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è)測試?yán)樱?/p>

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

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

深入學(xué)習(xí),可以交個(gè)朋友,工人人人號:韋凱峰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);

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

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

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

c語言函數(shù)指針的作用。

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ù)。

C語言函數(shù)指針

供參考:

//:

strcpyDemo.c

//author:

Problue

#include

stdio.h

#include

assert.h

/**

*

該函數(shù)將從src指向的數(shù)組中復(fù)制最多count個(gè)字符(不復(fù)制空字符后面的)到dest指向的數(shù)組中。

*

如果復(fù)制發(fā)生在兩個(gè)重疊的對象中,則行為未定義。

*

如果src指向的數(shù)組是一個(gè)長度比count短的字符串,則在dest指向的數(shù)組

*

后面添加空字符.直到寫入了count個(gè)字符。

*@param

dest

目標(biāo)數(shù)組

*@param

src

源數(shù)組

*@return

dest

*

*/

char*

strcopy(char*

dest,

const

char*

src,

int

count)

{

char*

sc

=

dest;

assert

((dest

!=

NULL)

(src

!=

NULL));

while

(

count

*src

!=

'\0')//

復(fù)制字符

[max

count]

src

dest

[count]

{

*sc++

=

*src++;

--count;

}

for

(;

count;

--count)

//

寫入空字符到dest

{

*sc

=

'\0';

}

return

dest;

}

typedef

char*

(*STR_FUNC)(char*,

const

char*,

int);

int

main()

{

STR_FUNC

func

=

strcopy;

const

int

A_LENGTH

=

30;

char

a[A_LENGTH

+

1];//

=

"abc";

char*

b

=

"defg";

func(a,

b,

A_LENGTH);

puts(a);

puts(b);

getchar();

return

0;

}

C語言中的指針是什么意思?

其實(shí)與其你在這里問,還不如看一看c語言教科書,上面寫的都很詳細(xì)

以下是譚浩強(qiáng)版的

在計(jì)算機(jī)中,所有的數(shù)據(jù)都是存放在存儲器中的。一般把存儲器中的一個(gè)字節(jié)稱為一個(gè)內(nèi)存單元,不同的數(shù)據(jù)類型所占用的內(nèi)存單元數(shù)不等,如整型量占2個(gè)單元,字符量占1個(gè)單元等,在前面已有詳細(xì)的介紹。為了正確地訪問這些內(nèi)存單元,必須為每個(gè)內(nèi)存單元編上號。根據(jù)一個(gè)內(nèi)存單元的編號即可準(zhǔn)確地找到該內(nèi)存單元。內(nèi)存單元的編號也叫做地址。

既然根據(jù)內(nèi)存單元的編號或地址就可以找到所需的內(nèi)存單元,所以通常也把這個(gè)地址稱為指針。

內(nèi)存單元的指針和內(nèi)存單元的內(nèi)容是兩個(gè)不同的概念。

可以用一個(gè)通俗的例子來說明它們之間的關(guān)系。我們到銀行去存取款時(shí),

銀行工作人員將根據(jù)我們的帳號去找我們的存款單,

找到之后在存單上寫入存款、取款的金額。在這里,帳號就是存單的指針,

存款數(shù)是存單的內(nèi)容。對于一個(gè)內(nèi)存單元來說,單元的地址即為指針,其中存放的數(shù)據(jù)才是該單元的內(nèi)容。在C語言中,允許用一個(gè)變量來存放指針,這種變量稱為指針變量。因此,一個(gè)指針變量的值就是某個(gè)內(nèi)存單元的地址或稱為某內(nèi)存單元的指針。

嚴(yán)格地說,一個(gè)指針是一個(gè)地址,是一個(gè)常量。而一個(gè)指針變量卻可以被賦予不同的指針值,是變量。但常把指針變量簡稱為指針。為了避免混淆,我們中約定:“指針”是指地址,是常量,“指針變量”是指取值為地址的變量。定義指針的目的是為了通過指針去訪問內(nèi)存單元。

既然指針變量的值是一個(gè)地址,那么這個(gè)地址不僅可以是變量的地址,也可以是其它數(shù)據(jù)結(jié)構(gòu)的地址。在一個(gè)指針變量中存放一個(gè)數(shù)組或一個(gè)函數(shù)的首地址有何意義呢?

因?yàn)閿?shù)組或函數(shù)都是連續(xù)存放的。通過訪問指針變量取得了數(shù)組或函數(shù)的首地址,也就找到了該數(shù)組或函數(shù)。這樣一來,凡是出現(xiàn)數(shù)組,函數(shù)的地方都可以用一個(gè)指針變量來表示,只要該指針變量中賦予數(shù)組或函數(shù)的首地址即可。這樣做,將會使程序的概念十分清楚,程序本身也精練,高效。在C語言中,一種數(shù)據(jù)類型或數(shù)據(jù)結(jié)構(gòu)往往都占有一組連續(xù)的內(nèi)存單元。

用“地址”這個(gè)概念并不能很好地描述一種數(shù)據(jù)類型或數(shù)據(jù)結(jié)構(gòu),而“指針”雖然實(shí)際上也是一個(gè)地址,但它卻是一個(gè)數(shù)據(jù)結(jié)構(gòu)的首地址,它是“指向”一個(gè)數(shù)據(jù)結(jié)構(gòu)的,因而概念更為清楚,表示更為明確。

這也是引入“指針”概念的一個(gè)重要原因。

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

/*

函數(shù)指針,關(guān)鍵是后面兩個(gè)字“指針”,顧名思義,是一個(gè)指向函數(shù)的指針

原理:函數(shù)在創(chuàng)建好了后,函數(shù)的代碼會在內(nèi)存中占有個(gè)位置,這時(shí)我們創(chuàng)造一個(gè)指針來指向這個(gè)地址,這個(gè)指針就叫函數(shù)指針

函數(shù)指針不可以移動,想要移動指針的位置來指向函數(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;

}

網(wǎng)頁標(biāo)題:c語言函數(shù)中指針 c語言函數(shù)指針和指針函數(shù)
網(wǎng)站路徑:http://muchs.cn/article16/hjdcdg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、用戶體驗(yàn)、網(wǎng)站收錄、外貿(mào)網(wǎng)站建設(shè)、做網(wǎng)站、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(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)

成都定制網(wǎng)站建設(shè)