【C語言】函數指針與指針函數

寫在前面的話:

  1. 版權聲明:本文爲博主原創文章,轉載請註明出處!
  2. 博主是一個小菜鳥,並且非常玻璃心!如果文中有什麼問題,請友好地指出來,博主查證後會進行更正,啾咪~~
  3. 每篇文章都是博主現階段的理解,如果理解的更深入的話,博主會不定時更新文章。
  4. 本文最後更新時間:2020.5.9

正文開始

1. typedef

typedef用於爲各種數據類型定義新名字。

語法:

typedef unsigned char BYTE;

在這個類型定義之後,標識符 BYTE 可作爲類型 unsigned char 的縮寫,例如:BYTE b1, b2;

2. 函數指針

函數指針:指向函數的指針。

定義爲:

數據類型 (*func)(參數列表);

例如:

void (*func)(int*, int*);

2.1 函數指針的使用方式

  1. 定義函數指針
  2. 定義函數
  3. 把函數的地址賦給函數指針
  4. 通過函數指針調用函數

例如:

// 1. 定義函數指針
int (*pfun)(int*, int*);

// 2. 定義函數
int fun(int*, int*);

// 3. 把函數的地址賦給函數指針
pfun = fun;

// 4. 通過函數指針調用函數
// pfun是函數的地址,*pfun就是函數本身了
(*pfun)(p, q);

2.2 關於 typedef int (* func)(int, int)

先看一下例子:

#include <stdio.h>

int add(int a, int b)
{
    return (a + b);
}

typedef int (*function)(int, int);

int main()
{
    function func = add;
    int sum = func(4, 5);

    printf("sum = %d\n", sum);

    return 0;
}

在例子中,定義函數指針類型function,它指向函數int (int, int)的指針,也就是說 function 表示的是這種類型的函數的地址。

需要注意的是,函數名不是其類型的一部分,函數的類型只由它的返回值和參數列表決定,指向add()的指針必須指向與add()相同類型的函數,即有相同的返回類型和相同的參數表。

int (* func)(int, int)int* func(int, int)是不同的,前者是函數指針,後者是指針函數,後者說明的是返回一個int類型的指針。

3. 指針函數

指針函數:返回值是指針的函數

定義爲:

數據類型 * func(參數列表);

例如:

char* func(int*, int*);

注意
當函數的返回值是指針類型的時候,儘量不要返回局部變量的指針。
原因
局部變量定義在函數的內部,當函數的調用結束之後,局部變量的棧內存也會被釋放,並不能得到正確的返回值。實際上,指針的地址返回的時候,內存已經被釋放了,所以這個時候地址已經無效了,此時再使用這個指針會很危險。

參考

《C和指針》
《高質量嵌入式Linux C編程》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章