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

首頁 > 編程 > C > 正文

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

2020-01-26 16:14:18
字體:
來源:轉載
供稿:網友

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

復制代碼 代碼如下:

#include<stdio.h>

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<stdio.h>

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<stdio.h>
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<stdio.h>
#include<stdlib.h>
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<signal.h>
#include<stdlib.h>
#include<stdio.h>

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<stdio.h>

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;
}


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

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91亚洲一区精品| 亚洲国产精品成人av| 在线观看国产欧美| 久久综合网hezyo| 清纯唯美日韩制服另类| 青青久久aⅴ北条麻妃| 国产日韩在线观看av| 亚洲一品av免费观看| 亚洲精品美女久久久久| 久久久久久网址| 欧美电影在线免费观看网站| 中文字幕欧美国内| 亚洲欧美在线一区| 蜜臀久久99精品久久久无需会员| 一区二区三区四区在线观看视频| 97精品一区二区视频在线观看| 92看片淫黄大片欧美看国产片| 日韩av电影中文字幕| 国产在线观看91精品一区| 91亚洲精品久久久久久久久久久久| 亚洲人av在线影院| 久久色免费在线视频| 久久精品视频一| 欧美香蕉大胸在线视频观看| 中文字幕亚洲欧美| 欧美精品在线免费| 久久国产精品免费视频| 97热在线精品视频在线观看| 亚洲一区二区在线播放| 中文字幕亚洲精品| 国产精品免费小视频| 亚洲一区国产精品| 国产一区在线播放| 久久久国产精品亚洲一区| 成人免费观看a| 亚洲国产精品久久久| 国产91在线视频| 国产精品毛片a∨一区二区三区|国| 日本精品免费观看| 欧美一区二区三区免费视| 国产情人节一区| 91免费看国产| 欧美放荡办公室videos4k| 俺去亚洲欧洲欧美日韩| 中文字幕一精品亚洲无线一区| 亚洲国产欧美在线成人app| 精品无人区乱码1区2区3区在线| 欧美亚洲成人xxx| 亚洲精品一区二区三区不| 日本精品视频在线| 国产精品久久久久久久久久免费| 国产不卡av在线| 亚洲色图美腿丝袜| 精品激情国产视频| 91亚洲精品久久久| 91精品视频在线播放| 中文字幕亚洲字幕| 91精品国产综合久久男男| 亚洲精品丝袜日韩| 97精品一区二区视频在线观看| 亲爱的老师9免费观看全集电视剧| 国产日韩在线观看av| 中文字幕av一区中文字幕天堂| 热久久免费国产视频| 7777kkkk成人观看| 欧美性猛交视频| 亚洲人成电影在线观看天堂色| 国产美女精彩久久| 欧洲成人在线视频| 日韩欧美在线看| 国产精品一久久香蕉国产线看观看| 久久久久久亚洲精品| 国产精品美女久久久久av超清| 久久久久久久久久久久av| 欧美激情一级欧美精品| 色哟哟网站入口亚洲精品| 久久久久国产精品免费| 成人免费视频97| 久久在精品线影院精品国产| 国产男女猛烈无遮挡91| 中文字幕亚洲欧美在线| 日韩视频在线免费观看| 伊人av综合网| 另类美女黄大片| 国产精自产拍久久久久久| 456国产精品| 一本大道亚洲视频| 久久精品久久精品亚洲人| 亚洲精品永久免费精品| 成人精品一区二区三区电影免费| 日韩欧美aaa| 91影院在线免费观看视频| 日韩影视在线观看| www欧美xxxx| 亚洲自拍偷拍一区| 欧美黑人巨大精品一区二区| 久色乳综合思思在线视频| 中文国产成人精品久久一| 亚洲精品之草原avav久久| 国产精品久久久久免费a∨| 亚洲aa中文字幕| 国产精品一区二区三区毛片淫片| 欧美精品成人在线| 国产91精品青草社区| 亚洲欧洲美洲在线综合| 精品亚洲一区二区三区四区五区| 日本老师69xxx| 77777亚洲午夜久久多人| 海角国产乱辈乱精品视频| 欧美xxxx做受欧美.88| 成人午夜激情网| 欧美激情久久久久| 欧美在线www| 亚洲性线免费观看视频成熟| 亚洲第一男人天堂| 97在线视频观看| 亚洲专区中文字幕| 日韩中文字幕网址| 成人欧美一区二区三区在线湿哒哒| 国产亚洲欧美日韩精品| 日韩欧美在线观看| 91在线视频导航| 欧美中文字幕在线| 国产91精品不卡视频| 亚洲电影免费观看高清完整版| 欧美大尺度在线观看| 国产成人97精品免费看片| 亚洲国产成人在线播放| 国产亚洲美女精品久久久| 久久影视电视剧免费网站| 亚洲色图综合网| 日韩成人激情视频| 国产精品嫩草影院久久久| 国产精品视频午夜| 91av在线视频观看| 国产丝袜精品第一页| 中文字幕精品一区二区精品| 91精品视频免费| 日韩欧美在线第一页| 亚洲精品一区二区在线| 午夜免费久久久久| 日韩在线视频线视频免费网站| 92国产精品视频| 国产成人涩涩涩视频在线观看| 97久久精品人人澡人人爽缅北| 亚洲人成电影在线| 午夜精品一区二区三区在线视频| 欧美激情综合色| 日韩精品欧美激情| 精品视频久久久久久久| 久久久久久久久亚洲| 日韩美女在线看| 日韩成人中文电影| 日韩在线观看成人| 亚洲中国色老太| 日韩免费观看av| 国产精品美女在线| 久久久精品影院| 在线免费看av不卡| 精品视频久久久久久久| 日韩欧美在线视频日韩欧美在线视频| 国产精品福利在线| 92裸体在线视频网站| 国产精品视频白浆免费视频|