亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言中函數與指針的應用總結

2020-02-24 14:34:08
字體:
來源:轉載
供稿:網友

閑著也是閑著,今天武林技術頻道的小編就給小伙伴們帶來C語言函數指針的應用總結,指針的使用是C語言程序設計中一個重要的特色,從指針的定義和指針的類型等方面對C語言指針的概念進行了簡單的分析,一起來往下了解吧。

1. 首先,在C語言中函數是一種function-to-pointer的方式,即對于一個函數,會將其自動轉換成指針的類型.

復制代碼 代碼如下:

#include

void fun()
{
}

int main(void)
{
printf("%p %p %p/n", &fun, fun, *fun);
return 0;
}


-------------------------------------------------------------------------------------------

這三個值的結果是一樣的. 其實對于最后的那個*fun, 即使前面加上很多個*號, 其結果也不變, 即**fun, ***fun的結果都是一樣的.
對于這個問題, 因為之前講過函數是一種function-to-pointer方式, 其會自動轉換成指針的類型, &fun是該函數的地址, 為指針類型, fun是一個函數, 會轉換成其指針類型, 而對于*fun, 由于fun已經變成了指針類型, 指向這個函數, 所以*fun就是取這個地址的函數, 而又根據function-to-pointer, 該函數也轉變成了一個指針, 所以以此類推, 這三個值的結果是相同的.

===================================================
2. 如何調用一個地址上的函數
如果知道了一個函數所在的地址, 可以將其強制轉化成某一種類型的函數指針, 然后再根據這個指針去調用這個地址的函數. 如:

復制代碼 代碼如下:

#include

void f(int i)
{
printf("i = %d/n", i);
}

int main(void)
{
unsigned long add;
add = (unsigned long)f;
((void (*)(int))add)(10);
(*(void (*)(int))add)(20);
return 0;
}


---------------------------------------------------------------------------------------
使用(void (*)(int))的方式可以將一個地址轉換成一個帶int參數且沒有返回值的函數的指針類型, 然后再去調用, 由于第1點中講的function-to-pointer, 所以最后兩條語句中加與不加那個*號效果都是一樣的. 在嵌入式方面經常用到這種方式.
=====================================================

3. 函數指針數組的用法.
有時候需要定義一個數組, 其內容為一系列的函數指針, 然后對其進行調用, 如:

復制代碼 代碼如下:


#include
int max(int v1, int v2)
{
return (v1 > v2 ? v1 : v2);
}

int min(int v1, int v2)
{
return (v1 < v2 ? v1 : v2);
}

int sum(int v1, int v2)
{
return (v1 + v2);
}

復制代碼 代碼如下:


int main(void)
{
int (*p[3])(int, int);
p[0] = max;
p[1] = min;
p[2] = sum;

printf("p[0] = %d/n", (p[0])(3, 5));
printf("p[1] = %d/n", (p[1])(4, 6));
printf("p[2] = %d/n", (p[2])(1, 2));
return 0;
}


-----------------------------------------------------------------------------------------
雖然感覺這種方法有點累贅, 但是也算是一種使用的方式, 所以介紹一下.
============================================

4.返回一個指向數組的指針的方式

可以讓函數返回一個指向數組的一個指針, 如:

復制代碼 代碼如下:

#include
#include
int (*p())[10]
{
int (*m)[10];
int i;
m = (int (*)[10])malloc(10 * sizeof(int));
if (m == NULL) {
printf("malloc error/n");
exit(1);
}
for (i = 0; i < 10; i++)
*(*m+i) = i+1;

return m;
}

復制代碼 代碼如下:


int main(void)
{
int (*a)[10];
int i;
a = p();
for (i = 0; i < 10; i++)
printf("%d ", *(*a+i));
printf("/ndone/n");

return 0;
}


-------------------------------------------------------------------
這種方式中,int (*a)[10]是一個指向一維數組的一個指針, 而p()也是返回一個指向一維數組的一個指針.
===================================================

5.返回一個函數指針的指針

/============================================/
/ 在看到快速排序的例子中使用到返回指針的函數.所以特此查找到這篇文章,覺得很好... /
/============================================/

對這個問題, signal()函數是最好的例子.
void (*signal (int signo, void (*func)(int)))(int);
很多朋友剛開始看這個函數定義的時候是不太懂, 其實可以一步一步地慢慢看, 我以前是這樣分析的, 希望能對大家有用.
int (*p)();
這是一個函數指針, p所指向的函數是一個不帶任何參數, 并且返回值為int的一個函數.
int (*fun())();
這個式子與上面式子的區別在于用fun()代替了p,而fun()是一個函數,所以說就可以看成是fun()這個函數執行之后,它的返回值是一個函數指針,這個函數指針(其實就是上面的p)所指向的函數是一個不帶任何參數,并且返回值為int的一個函數.

所以說signal()可以看成是signal()函數(它自己是帶兩個參數,一個為整型,一個為函數指針的函數), 而這個signal()函數的返回值也為一個函數指針,這個函數指針指向一個帶一個整型參數,并且返回值為void的一個函數.

=================================
signal函數返回的其實是指向以前的信號處理程序的指針, 所以舉一個例子來說明返回指向函數的指針的用法.

復制代碼 代碼如下:

#include
#include
#include

void sig_fun2(int signo)
{
printf("in sig_fun2:%d/n", signo);
}

void sig_fun1(int signo)
{
printf("in sig_fun1:%d/n", signo);
}

int main(void)
{
unsigned long i;
if (signal(SIGUSR1, sig_fun1) == SIG_ERR) {
printf("signal fun1 error/n");
exit(1);
}

(signal(SIGUSR1, sig_fun2))(30);

printf("done/n");
return 0;
}


====================================================
6. 使用函數指針作為參數的情況 (以前的記錄提到過.)
在函數的參數中, 可能會帶有一個函數指針, 這在signal()函數中是出現了的.
其實在很多排序函數中就是使用的這個參數為函數指針的方式來進行調用的.比如Quicksort

例如:

復制代碼 代碼如下:

#include

int max(int v1, int v2)
{
return (v1 > v2 ? v1 : v2);
}

int min(int v1, int v2)
{
return (v1 < v2 ? v1 : v2);
}

int sum(int v1, int v2)
{
return (v1 + v2);
}

int fun(int a, int b, int (*call)(int, int))
{
return (call(a, b));
}

int main(void)
{
printf("max=%d/n", fun(1, 2, max));
printf("min=%d/n", fun(3, 4, min));
printf("sum=%d/n", fun(5, 6, sum));
return 0;
}

以上就是武林技術小編分享的C語言中函數與指針的應用總結,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品久久久精品| 色七七影院综合| 亚洲欧美国产日韩天堂区| 国产91精品久久久久久久| 欧美日韩一区二区三区在线免费观看| 亚洲人精品午夜在线观看| www.欧美精品一二三区| 美女啪啪无遮挡免费久久网站| 欧美性xxxx极品hd欧美风情| 在线观看日韩专区| 在线日韩精品视频| 国产成人精品国内自产拍免费看| 国产精品18久久久久久首页狼| 日韩国产精品视频| 国内成人精品一区| 久久伊人精品一区二区三区| 亚洲精品福利视频| 91精品国产乱码久久久久久蜜臀| 国产精品日韩一区| 91九色国产在线| 国产成人精品久久二区二区| 亚洲国产又黄又爽女人高潮的| 国产亚洲欧美aaaa| 日本免费久久高清视频| 亚洲黄色在线看| 国产日韩欧美91| 中文字幕亚洲欧美日韩高清| 亚洲国模精品私拍| 国产成人精彩在线视频九色| 亚洲片在线资源| 亚洲性视频网址| 欧美理论在线观看| 97久久精品国产| 国产精品久久久久久久天堂| 亚洲电影在线看| 国产suv精品一区二区三区88区| 国产欧美日韩视频| 欧美高清电影在线看| 性欧美视频videos6一9| 国产精品一区二区久久久久| 奇门遁甲1982国语版免费观看高清| 欧美综合一区第一页| 日韩久久精品成人| 日本韩国在线不卡| 久久成人精品一区二区三区| 日韩中文在线中文网在线观看| 久久久久亚洲精品成人网小说| 国产人妖伪娘一区91| 日韩在线视频二区| 亚洲激情视频在线| 久久久精品免费视频| 久久久噜噜噜久噜久久| 91在线观看免费高清| 亚洲缚视频在线观看| 亚洲欧美日韩另类| 97在线免费观看| 欧美福利小视频| 亚洲精品v欧美精品v日韩精品| 日韩在线播放视频| 国产精品久久久久av免费| 欧美高清自拍一区| 欧美电影免费观看高清完整| 日韩av网站在线| 91精品视频一区| 国产欧美日韩丝袜精品一区| 91在线高清免费观看| 日韩高清av一区二区三区| 国产亚洲xxx| 亚洲国产成人在线播放| 在线播放国产一区中文字幕剧情欧美| 国产亚洲激情在线| 亚洲一区二区三区成人在线视频精品| 国产精品精品视频| 国产成人精品免高潮费视频| 亚洲激情在线观看视频免费| 欧美性xxxxxxx| 国产中文欧美精品| 国产精品久久久久久av下载红粉| 国产一区二区在线播放| 欧美丰满少妇xxxx| 国产成+人+综合+亚洲欧美丁香花| 欧美另类交人妖| 亚洲午夜av久久乱码| 亚洲欧洲国产一区| 国产精品久久久久秋霞鲁丝| 少妇高潮久久77777| 国产精品视频区1| 久久亚洲精品中文字幕冲田杏梨| 亚洲福利影片在线| 国产成人精品免费久久久久| 夜夜嗨av一区二区三区四区| 亚洲免费精彩视频| 亚洲一区二区中文| 国产免费一区二区三区香蕉精| 亚洲一区二区三区xxx视频| 国产成人精品免高潮费视频| 欧美色欧美亚洲高清在线视频| 日韩在线视频播放| 久久久av电影| 夜夜狂射影院欧美极品| 国产精品扒开腿做爽爽爽男男| 国a精品视频大全| 日韩网站免费观看| 91理论片午午论夜理片久久| 亚洲精品www久久久久久广东| 国产精品99久久久久久白浆小说| 韩国精品久久久999| 日韩精品免费综合视频在线播放| 久久久久国产视频| 色偷偷888欧美精品久久久| 国产精品日日摸夜夜添夜夜av| 91在线网站视频| 成人网在线视频| 国产精品久久久久久五月尺| 亚洲аv电影天堂网| 国产xxx69麻豆国语对白| 国产精品入口福利| 国内精品久久影院| 国产精品久久久久77777| 日韩精品久久久久| 欧美精品情趣视频| 91免费视频国产| 欧美性猛交99久久久久99按摩| 欧美电影在线免费观看网站| 亚洲高清在线观看| 亚洲精品国偷自产在线99热| 亚洲欧美激情一区| 日本欧美在线视频| 日韩中文字幕在线免费观看| 国产小视频91| 欧美午夜电影在线| 曰本色欧美视频在线| 久久精视频免费在线久久完整在线看| 高清欧美电影在线| 91九色单男在线观看| 精品人伦一区二区三区蜜桃免费| 成人黄色激情网| 欧美自拍大量在线观看| 91精品国产91久久| 亚洲欧美制服第一页| 成人免费福利视频| 亚洲第一区中文字幕| 亚洲男人第一av网站| 日韩中文字幕网| 国产不卡一区二区在线播放| 国产suv精品一区二区| 欧美亚洲在线播放| 欧美疯狂xxxx大交乱88av| 国产精品久久久久影院日本| 91福利视频网| 欧美成aaa人片在线观看蜜臀| 久久精品99国产精品酒店日本| 国产精品精品视频一区二区三区| 国产中文欧美精品| 久久久久久中文| 国产日韩欧美在线观看| 欧美日韩在线影院| 亚洲第一色在线| 亚洲精品国精品久久99热| 亚洲成人在线视频播放| 欧美国产激情18| 亚洲精品乱码久久久久久金桔影视| 国内精品国产三级国产在线专| 亚洲精品一区中文字幕乱码|