寫在前面的話:
- 版權聲明:本文爲博主原創文章,轉載請註明出處!
- 博主是一個小菜鳥,並且非常玻璃心!如果文中有什麼問題,請友好地指出來,博主查證後會進行更正,啾咪~~
- 每篇文章都是博主現階段的理解,如果理解的更深入的話,博主會不定時更新文章。
- 本文最後更新時間: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. 定義函數指針
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編程》