最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言中函數(shù)與指針的應(yīng)用總結(jié)

 更新時(shí)間:2013年05月15日 09:00:27   作者:  
本篇文章是對(duì)C語(yǔ)言中函數(shù)與指針的應(yīng)用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下

1. 首先,在C語(yǔ)言中函數(shù)是一種function-to-pointer的方式,即對(duì)于一個(gè)函數(shù),會(huì)將其自動(dòng)轉(zhuǎn)換成指針的類型.

復(fù)制代碼 代碼如下:

#include<stdio.h>

void fun()
{
}

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


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

這三個(gè)值的結(jié)果是一樣的. 其實(shí)對(duì)于最后的那個(gè)*fun, 即使前面加上很多個(gè)*號(hào), 其結(jié)果也不變, 即**fun, ***fun的結(jié)果都是一樣的.
對(duì)于這個(gè)問(wèn)題, 因?yàn)橹爸v過(guò)函數(shù)是一種function-to-pointer方式, 其會(huì)自動(dòng)轉(zhuǎn)換成指針的類型, &fun是該函數(shù)的地址, 為指針類型, fun是一個(gè)函數(shù), 會(huì)轉(zhuǎn)換成其指針類型, 而對(duì)于*fun, 由于fun已經(jīng)變成了指針類型, 指向這個(gè)函數(shù), 所以*fun就是取這個(gè)地址的函數(shù), 而又根據(jù)function-to-pointer, 該函數(shù)也轉(zhuǎn)變成了一個(gè)指針, 所以以此類推, 這三個(gè)值的結(jié)果是相同的.

===================================================
2. 如何調(diào)用一個(gè)地址上的函數(shù)
如果知道了一個(gè)函數(shù)所在的地址, 可以將其強(qiáng)制轉(zhuǎn)化成某一種類型的函數(shù)指針, 然后再根據(jù)這個(gè)指針去調(diào)用這個(gè)地址的函數(shù). 如:

復(fù)制代碼 代碼如下:

#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))的方式可以將一個(gè)地址轉(zhuǎn)換成一個(gè)帶int參數(shù)且沒(méi)有返回值的函數(shù)的指針類型, 然后再去調(diào)用, 由于第1點(diǎn)中講的function-to-pointer, 所以最后兩條語(yǔ)句中加與不加那個(gè)*號(hào)效果都是一樣的. 在嵌入式方面經(jīng)常用到這種方式.
=====================================================

3. 函數(shù)指針數(shù)組的用法.
有時(shí)候需要定義一個(gè)數(shù)組, 其內(nèi)容為一系列的函數(shù)指針, 然后對(duì)其進(jìn)行調(diào)用, 如:
復(fù)制代碼 代碼如下:

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


復(fù)制代碼 代碼如下:

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


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

4.返回一個(gè)指向數(shù)組的指針的方式

可以讓函數(shù)返回一個(gè)指向數(shù)組的一個(gè)指針, 如:

復(fù)制代碼 代碼如下:

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

復(fù)制代碼 代碼如下:

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]是一個(gè)指向一維數(shù)組的一個(gè)指針, 而p()也是返回一個(gè)指向一維數(shù)組的一個(gè)指針.
===================================================

5.返回一個(gè)函數(shù)指針的指針

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

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

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

=================================
signal函數(shù)返回的其實(shí)是指向以前的信號(hào)處理程序的指針, 所以舉一個(gè)例子來(lái)說(shuō)明返回指向函數(shù)的指針的用法.

復(fù)制代碼 代碼如下:

#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. 使用函數(shù)指針作為參數(shù)的情況 (以前的記錄提到過(guò).)
在函數(shù)的參數(shù)中, 可能會(huì)帶有一個(gè)函數(shù)指針, 這在signal()函數(shù)中是出現(xiàn)了的.
其實(shí)在很多排序函數(shù)中就是使用的這個(gè)參數(shù)為函數(shù)指針的方式來(lái)進(jìn)行調(diào)用的.比如Quicksort

例如:

復(fù)制代碼 代碼如下:

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


相關(guān)文章

  • 關(guān)于C++數(shù)組中重復(fù)的數(shù)字

    關(guān)于C++數(shù)組中重復(fù)的數(shù)字

    這篇文章主要介紹得是關(guān)于C++數(shù)組中重復(fù)的數(shù)字,文章以問(wèn)題描述得形式,對(duì)問(wèn)題展開(kāi)分析用不同得方法去解決問(wèn)題并附上方法得詳細(xì)代碼,需要的朋友可以參考以下文章得具體內(nèi)容
    2021-11-11
  • c++中臨時(shí)變量不能作為非const的引用參數(shù)的方法

    c++中臨時(shí)變量不能作為非const的引用參數(shù)的方法

    下面小編就為大家?guī)?lái)一篇c++中臨時(shí)變量不能作為非const的引用參數(shù)的方法。小編覺(jué)得挺不錯(cuò)的現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • C++超詳細(xì)講解RTTI和cast運(yùn)算符的使用

    C++超詳細(xì)講解RTTI和cast運(yùn)算符的使用

    RTTI(Runtime Type Identification)是“運(yùn)行時(shí)類型識(shí)別”的意思。C++引入這個(gè)機(jī)制是為了讓程序在運(yùn)行時(shí)能根據(jù)基類的指針或引用來(lái)獲得該指針或引用所指的對(duì)象的實(shí)際類型,cast強(qiáng)制轉(zhuǎn)換運(yùn)算符是一種特殊的運(yùn)算符,它把一種數(shù)據(jù)類型轉(zhuǎn)換為另一種數(shù)據(jù)類型
    2022-08-08
  • C++中圖片類型的識(shí)別與轉(zhuǎn)換詳解方法

    C++中圖片類型的識(shí)別與轉(zhuǎn)換詳解方法

    本文簡(jiǎn)單的介紹一下C++語(yǔ)言中如何識(shí)別圖片文件的類型,以及各圖片類型之間的轉(zhuǎn)換方法,并提供相關(guān)的源碼供大家參考,感興趣的朋友快來(lái)看看吧
    2021-11-11
  • 使用C++實(shí)現(xiàn)給PDF文檔添加文字水印

    使用C++實(shí)現(xiàn)給PDF文檔添加文字水印

    這篇文章主要為大家詳細(xì)介紹了如何通過(guò)第三方國(guó)產(chǎn)庫(kù)Spire.PDF?for?C++來(lái)實(shí)現(xiàn)給PDF文檔添加文字水印,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • QT實(shí)戰(zhàn)之實(shí)現(xiàn)圖片瀏覽系統(tǒng)

    QT實(shí)戰(zhàn)之實(shí)現(xiàn)圖片瀏覽系統(tǒng)

    這篇文章主要介紹了如何利用QT編寫一個(gè)圖片瀏覽系統(tǒng),可以支持自動(dòng)播放,左右拖動(dòng)切換,點(diǎn)擊列表切換,點(diǎn)擊按鈕切換等功能,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-04-04
  • C++中的偽隨機(jī)數(shù)

    C++中的偽隨機(jī)數(shù)

    這篇文章主要介紹了C++中的偽隨機(jī)數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C語(yǔ)言中操作utmp文件的相關(guān)函數(shù)用法

    C語(yǔ)言中操作utmp文件的相關(guān)函數(shù)用法

    這篇文章主要介紹了C語(yǔ)言中操作utmp文件的相關(guān)函數(shù)用法,包括getutent()函數(shù)和setutent()函數(shù)以及endutent()函數(shù),需要的朋友可以參考下
    2015-08-08
  • 使用C語(yǔ)言來(lái)解決循環(huán)隊(duì)列問(wèn)題的方法

    使用C語(yǔ)言來(lái)解決循環(huán)隊(duì)列問(wèn)題的方法

    這篇文章主要介紹了使用C語(yǔ)言來(lái)解決循環(huán)隊(duì)列問(wèn)題的方法,來(lái)自ACM的練習(xí)題實(shí)例,需要的朋友可以參考下
    2015-08-08
  • C++設(shè)計(jì)模式之模板方法模式

    C++設(shè)計(jì)模式之模板方法模式

    這篇文章主要介紹了C++設(shè)計(jì)模式之模板方法模式,本文講解了什么是模板方法模式、模板方法模式的UML類圖、模板方法模式的使用場(chǎng)合等內(nèi)容,需要的朋友可以參考下
    2014-10-10

最新評(píng)論

毕节市| 大渡口区| 中西区| 青田县| 珠海市| 丰镇市| 永新县| 紫金县| 弥勒县| 岐山县| 呼伦贝尔市| 麟游县| 茶陵县| 洪江市| 玛多县| 瓮安县| 凌海市| 南溪县| 娄烦县| 彰化市| 黄浦区| 七台河市| 满城县| 乐昌市| 滕州市| 富蕴县| 青田县| 海晏县| 磐石市| 鞍山市| 牙克石市| 清苑县| 克拉玛依市| 靖远县| 呼图壁县| 东乡族自治县| 西峡县| 秦皇岛市| 通道| 南溪县| 溧水县|