欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言中函數(shù)與指針的應用總結

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

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

復制代碼 代碼如下:

#include<stdio.h>

void fun()
{
}

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


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

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

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

復制代碼 代碼如下:

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

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

#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.返回一個指向數(shù)組的指針的方式

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

復制代碼 代碼如下:

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

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

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

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

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

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

復制代碼 代碼如下:

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


相關文章

  • C++中atof?函數(shù)的介紹

    C++中atof?函數(shù)的介紹

    這篇文章主要給大家分享的是C++中atof?函數(shù)的介紹,在?stdlib.h?中?atof?函數(shù),可用于將?char?字符串轉(zhuǎn)為?float?/?double?浮點數(shù)類型,想具體了解語法的小伙伴可以參考下面文章的內(nèi)容,希望對大家有所幫助
    2021-11-11
  • C語言數(shù)組學習之特殊矩陣的壓縮存儲

    C語言數(shù)組學習之特殊矩陣的壓縮存儲

    矩陣在計算機圖形學、工程計算中都占有舉足輕重的地位,本文將討論如何將矩陣更有效地存儲在內(nèi)存中,并且能夠方便地提取矩陣中的元素。感興趣的同學可以了解一下
    2021-12-12
  • 簡要說明C語言中指針函數(shù)與函數(shù)指針的區(qū)別

    簡要說明C語言中指針函數(shù)與函數(shù)指針的區(qū)別

    這篇文章主要介紹了C語言中指針函數(shù)與函數(shù)指針的區(qū)別,指針函數(shù)和函數(shù)指針是C語言入門學習中的基礎知識,需要的朋友可以參考下
    2016-04-04
  • VisualStudio2022 cmake配置opencv開發(fā)環(huán)境

    VisualStudio2022 cmake配置opencv開發(fā)環(huán)境

    本文主要介紹了VisualStudio2022 cmake配置opencv開發(fā)環(huán)境,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-08-08
  • 淺談Qt實現(xiàn)HTTP的Get/Post請求

    淺談Qt實現(xiàn)HTTP的Get/Post請求

    本文主要介紹了淺談Qt實現(xiàn)HTTP的Get/Post請求,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • C++四種case的詳細介紹小結

    C++四種case的詳細介紹小結

    本文主要介紹了C++四種case的詳細介紹小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • C語言 實現(xiàn)歸并排序算法

    C語言 實現(xiàn)歸并排序算法

    這篇文章主要介紹了C語言 實現(xiàn)歸并排序算法的相關資料,需要的朋友可以參考下
    2016-11-11
  • c語言之如何求e的近似值

    c語言之如何求e的近似值

    這篇文章主要介紹了c語言之如何求e的近似值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • C語言容易被忽視的函數(shù)設計原則基礎

    C語言容易被忽視的函數(shù)設計原則基礎

    C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產(chǎn)生少量的機器碼以及不需要任何運行環(huán)境支持便能運行的編程語言.那么C語言函數(shù)設計的一般原則和技巧都是怎樣的呢,下面帶你了解
    2022-04-04
  • C語言實現(xiàn)動態(tài)順序表的示例代碼

    C語言實現(xiàn)動態(tài)順序表的示例代碼

    順序表是用一段物理地址連續(xù)的存儲單元依次存儲數(shù)據(jù)元素的線性結構。順序表一般分為靜態(tài)順序表和動態(tài)順序表,本文主要和大家介紹的是動態(tài)順序表的實現(xiàn),需要的可以參考一下
    2022-10-10

最新評論