# Camera OV7670 第04段 typedef void (Fun) (void) ```javascript= void processGrayscaleFrameBuffered(); //緩衝處理灰度幀 void processGrayscaleFrameDirect(); //直接處理灰度幀 void processRgbFrameBuffered(); //緩衝處理RGB幀 void processRgbFrameDirect(); //直接處理RGB幀 typedef void (*ProcessFrameData)(void) ; #if UART_MODE==5 const uint16_t lineLength = 320; const uint16_t lineCount = 240; const uint32_t baud = 500000; const ProcessFrameData processFrameData = processRgbFrameBuffered; const uint16_t lineBufferLength = lineLength * 2; const bool isSendWhileBuffering = true; //這是在緩衝時發送 const uint8_t uartPixelFormat = UART_PIXEL_FORMAT_RGB565; CameraOV7670 camera(CameraOV7670::RESOLUTION_QVGA_320x240, CameraOV7670::PIXEL_RGB565, 32); #endif ``` ## 是甚麼 typedef void (Fun) (void) typedef能讓 my變成int的功能 ```javascript= int i ;// 定義整數i typedef int my; my j; //定義整數j ``` ### 函數指針 ```javascript= #include <iostream> using namespace std; char (*pFun)(int); //定義一個函數指針"*pFun" //他指向一個返回類型為char,有一個整數的參數函數 //定義一個返回類型char, 參數為int的函數 //從指針層面上理解該函數,即函數的函數名實際上是一個指針 //該指針指向函數在內存中的首地址 char glFun(int a){ cout <<a; //return a; } int main (){ pFun = glFun;//將函數gLFun的地址賦值給pFun //"pFun"顯然是取pFun所指向地址的內容 //當然也就是取出了函數glFun()的內容,然後給定參數為2 (*pFun)(2); return 0; { ``` ### typedef可以讓函數指針更直觀方便 typedef的功能是定義新的類型, 並定義這種類型為指向某種函數的指針 ```javascript= //這種函數以一個int為參數並返回char類型。 //後面就可以像使用int,char一樣使用PTRFUN了。 typedef char (*PTRfun)(int); PTRfun pFun;//使用這個新類型定義了變量pFun,此時就可以像使用形式1一樣使用這個變量了 char glFun(int a){return;} void main(){ pFun = glFun; (*pFun)(2); }</span> ``` 參考網站(https://blog.csdn.net/u014221279/article/details/50978204) :::spoiler 延伸閱讀 函數指針 “返回值類型”説明函數的返回類型,“(指針變量名 )”中的括號不能省 括號改變了運算符的優先級。若省略整體則成為一個函數説明 説明了一個返回的數據類型是指針的函數, 後面的“形參列表”表示指針變量指向的函數所帶的參數列表。 例如: ```javascript= int func(int x); / 聲明一個函數 / int (*f) (int x); / 聲明一個函數指針 / f=func; / 將func函數的首地址賦給指針f / 或者使用下面的方法將函數地址賦給函數指針: f = &func; ``` 賦值時函數func不帶括號,也不帶參數,由於func代表函數的首地址, 因此經過賦值以後,指針f就指向函數func(x)的代碼的首地址。 :::