日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C typedef功能介绍(内附函数指针和指针函数的区别)

發布時間:2024/10/14 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C typedef功能介绍(内附函数指针和指针函数的区别) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2018-01-10 創建人:Ruo_Xiao 開發環境:VS2010 2018-01-11 修改人:Ruo_Xiao 增加指針函數的解釋以及和函數指針的區別的理解。

查閱了很多資料,我的理解是:typedef的功能就是創建一個新的數據類型。
解釋如下:
1、下面代碼實際上是創造了一個新的數據類型:INT,只不過該數據類型的效果和int是一樣的。

typedef int INT; INT i = 0;

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、下面代碼定義了一個函數指針

int (*pAdd)(int x,int y);int Add(int x,int y) {return (x+y); }int _tmain(int argc, _TCHAR* argv[]) {pAdd = Add;cout<<"sum = "<<pAdd(2,3)<<endl;cin.get();return 0; }

這里大家可以發現,pAdd是一個函數指針變量,里面應該存放的內容是函數的首地址,類似于int *p,p里面存放的內容是int型變量的首地址。之后,我們將Add的函數的首地址賦給了pAdd,完成這個計算過程。
這里需要對這個函數指針變量pAdd的定義過程來一個全新的理解。

int (*pAdd)(int x,int y);拆分為 int (*)(int x,int y) 和 pAdd。前者的作用相當與int *,只不過int (*)(int x,int y)是用來聲明的變量是函數指針,該指針指向的函數是形參為 int xint y ,返回值為int的函數。后者是被聲明的函數指針變量。

所以,用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)若一個函數的地址傳給了其他函數,其他函數滿足一定條件之后,通過函數地址調用了該函數,那么該函數就是回調函數。
例如:

int (*pAdd)(int x,int y); //定義函數指針變量 int *pAdd(int x,int y); //定義指針函數

理解方法:
A、函數調用操作符“()”優先級高于“ * ”所以第二種的調用方式是先執行函數pAdd(int x,int y),最后執行“ * ”,所以所到底,其就是一個函數,只不過其返回值是一個指針而已。
B、對于第一種,由于用括號包住了“ * ”和“pAdd”,所以先執行”*pAdd” ,在執行函數調用運算符,所以pAdd就變成了一個指向形參為int x和int y,返回值是int的函數指針變量。

通過上述描述,大家是不是更加理解了二者的區別了呢?

(完)

總結

以上是生活随笔為你收集整理的C typedef功能介绍(内附函数指针和指针函数的区别)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。