C typedef功能介绍(内附函数指针和指针函数的区别)
查閱了很多資料,我的理解是:typedef的功能就是創建一個新的數據類型。
解釋如下:
1、下面代碼實際上是創造了一個新的數據類型:INT,只不過該數據類型的效果和int是一樣的。
2、下面代碼表示,typedef創造了一個新的數據類型:PCHAR,該類型的作用是定義字符指針變量。其好處是,PCHAR定義的變量都是字符指針變量。
typedef char* PCHAR; int _tmain(int argc, _TCHAR* argv[]) {PCHAR p1,p2;p1 = new char[2];p2 = new char[4];return 0; }3、下面代碼中,定義了一個結構體:Pt。在C中,定義Pt的結構體變量,只能帶這struct才可以,但是C++則二者均支持。
#include "stdafx.h" struct Pt {int x;int y; };int _tmain(int argc, _TCHAR* argv[]) {struct Pt p1; //C風格 Pt p2; //C++風格return 0; }在C中,為了解決這個問題,使用下面的代碼來代替上面的形式。
#include "stdafx.h"typedef struct Pt {int x;int y; } X_Pt;int _tmain(int argc, _TCHAR* argv[]) {struct Pt p1; //C風格 Pt p2; //C++風格X_Pt p3; //C風格return 0; }綜上,C++支持以上三種定義方式,但是C僅僅支持第1種和第3種。這里,typedef就是創造了一個新的數據類型:X_Pt,該數據類型實際上是一個結構體類型,里面有兩個定義,一個是int x,一個是int y。
4、下面代碼定義了一個函數指針
這里大家可以發現,pAdd是一個函數指針變量,里面應該存放的內容是函數的首地址,類似于int *p,p里面存放的內容是int型變量的首地址。之后,我們將Add的函數的首地址賦給了pAdd,完成這個計算過程。
這里需要對這個函數指針變量pAdd的定義過程來一個全新的理解。
所以,用typedef int(X_Add)(int x,int y)可以理解為typedef char PCHAR,相當于創造一個新的數據類型:X_Add,該數據類型專門定義指定的函數結構的函數指針變量。實例如下:
typedef int (*X_Add)(int x,int y);int Add(int x,int y) {return (x+y); }int _tmain(int argc, _TCHAR* argv[]) {X_Add const pAdd = Add;cout<<"sum = "<<pAdd(2,3)<<endl;cin.get();return 0; }以上就是typedef常用的用法。
5、拓展
(1)函數指針是一個指針變量,和其他指針變量一樣,占4個字節。用來存儲指定函數結構的函數的首地址。調用函數的方式是使用函數調用操作符“()”。
(2)指針函數是一個返回值為指針的普通函數。
(3)若一個函數的地址傳給了其他函數,其他函數滿足一定條件之后,通過函數地址調用了該函數,那么該函數就是回調函數。
例如:
理解方法:
A、函數調用操作符“()”優先級高于“ * ”所以第二種的調用方式是先執行函數pAdd(int x,int y),最后執行“ * ”,所以所到底,其就是一個函數,只不過其返回值是一個指針而已。
B、對于第一種,由于用括號包住了“ * ”和“pAdd”,所以先執行”*pAdd” ,在執行函數調用運算符,所以pAdd就變成了一個指向形參為int x和int y,返回值是int的函數指針變量。
通過上述描述,大家是不是更加理解了二者的區別了呢?
(完)
總結
以上是生活随笔為你收集整理的C typedef功能介绍(内附函数指针和指针函数的区别)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/Cpp / 条件编译
- 下一篇: vs2010 利用DMP文件、pdb文件