天天看點

C語言學習筆記:C語言的指針函數與函數指針??

前言

在C語言裡函數、指針這兩個詞結合的順序不同其意義也不同,即指針函數與函數指針的意義不同,這是什麼情況呢?估計許多學習C語言的小夥伴已經感覺自己懵懵的了,别急且聽小編來說個明白。

指針函數

指針函數的本質是一個函數,其傳回值是一個指針。示例如下:

int *pfun(int, int);
           

由于“*”的優先級低于“()”的優先級,因而pfun首先和後面的“()”結合,也就意味着,pfun是一個函數。即:int *(pfun(int, int));

接着再和前面的“*”結合,說明這個函數的傳回值是一個指針。由于前面還有一個int,也就是說,pfun是一個傳回值為整型指針的函數。

指針函數示例程式如下:

#include <stdio.h>


//這是一個指針函數的聲明

int *pfun(int *arr, int n);

int main(void)

{

int array[] = {0, 1, 2, 3, 4};

int len = sizeof(array)/sizeof(array[0]);

int *p;

int i;

//指針函數的調用

p = pfun(array, len);

for (i = 0; i < len; i++)

{

printf("array[%d] = %d\n", i, *(p+i));

}

return 0;

}

//這是一個指針函數,其傳回值為指向整形的指針

int *pfun(int *arr, int n)

{

int *p = arr;

return p;

}
           

程式運作結果如下:

C語言學習筆記:C語言的指針函數與函數指針??

主函數中,把一個數組的首位址與數組長度作為實參傳入指針函數pfun裡,把指針函數的傳回值(即指向數組的指針)賦給整形指針p。最後使用指針p來周遊數組元素并列印輸出。

這裡推薦一下我建的C/C++語言學習交流秋秋裙,前三位是:110,中間三位是:355,最後三位是:025,裡面有學習不錯視訊教程、開發工具、電子書籍,完整的項目源碼等,專業的老師解答問題!

函數指針

函數指針其本質是一個指針變量,該指針變量指向一個函數。C程式在編譯時,每一個函數都有一個入口位址,該入口位址就是函數指針所指向的位址。函數指針示例:

/*聲明一個函數指針 */

int (*fptr) (int, int);

/* 函數指針指向函數func */

fptr = func; // 或者fptr = &func;
           

func是一個函數名,那麼func與&func都表示的是函數的入口位址。同樣的,在函數的調用中可以使用:方式一:func(),也可以使用方式二:(*fun)()。這兩種調用方式是等價的,隻是我們平時大多都習慣用方式一的調用方法。

至于為什麼func與&func的含義相同,《嵌入式Linux上的C語言程式設計實踐》這本書中有如下解釋:

對于函數func來說,函數的名稱就是函數代碼區的常量,對它取位址(&func)可以得到函數代碼區的位址,同時,func本身也可以視為函數代碼區的位址。是以,函數名稱和對其取位址其含義是相同的。

函數指針示例程式如下:

#include <stdio.h>

int add(int a, int b);

int main(void)

{

int (*fptr)(int, int); //定義一個函數指針

int res; fptr = add; //函數指針fptr指向函數add

/* 通過函數指針調用函數 */

res = (*fptr)(1,2); //等價于res = fptr(1,2);

printf("a + b = %d\n", res);

return 0;

}

int add(int a, int b)

{

return a + b;

}
           

程式運作結果如下:

C語言學習筆記:C語言的指針函數與函數指針??

以上就是關于指針函數與函數指針的簡單區分。其中,函數指針廣泛應用于嵌入式軟體開發中,其常用的兩個用途:調用函數和做函數的參數。

繼續閱讀