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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

[C++ rudiment][转]typedef 使用

發布時間:2023/12/2 c/c++ 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [C++ rudiment][转]typedef 使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
typedef似乎很簡單,如typedef int integer;然而,這些簡單的typedef語句容易讓人產生一種誤解,typedef就是一種宏替換,把后面的自定義類型替換成前面的已知類型,事實是這樣的嗎?顯然不是!

?首先可以肯定的是,我們不能這樣去理解,因為雖然我們按照這樣的理解方式去理解對于上面這種形式(typedef int integer)可以通過,但是對于其它方式是通不過的。

??考慮這樣的問題:如何定義一個指向整型的指針類型?如何定義一個函數指針類型?

?第一個問題很簡單:typedef int* int_pointer;即可,對于第二個問題,似乎就沒有那么簡單了,首先,看函數指針的定義方法:int (*p)(const&, int); 這個p指向的函數必須返回int,形參必須是const&int?,F在要將這種指針類型命名為func_pointer,其定義的方法如下:

typedef int (*func_pointer)(const&, int);

按照以下方式理解就是正確的了:typedef int integer;typedef去掉,那就是個變量的定義,這兒即定義了一個int型的變量integer,考慮這個integer是什么類型的,那么這個typedef語句就是將integer定義為這個類型的。將typedef int (*func_pointer)(const&, int);中的typedef去掉,就成了一個函數指針定義,即func_pointer被定義為函數指針類型變量,那么原來的typedef即將func_pointer定義為函數指針類型。

?int (*testCases[10])();

?? 這個表達式是什么意思?指針,數組,函數糅合在了一起問題變得復雜起來。它定義了數組,testCases[10],數組中的元素是函數指針,函數指針的類型是 int (*)();

?? 怎么來理解這種定義呢?首先考慮數組的定義,數組的定義一般模式是:類型 數組名[大小];

考慮這個表達式,似乎是定義了一個數組,但是數組名[大小]被夾在了中間,那么類型是什么呢,發現類型并不是簡單的數據類型,而是一個函數指針類型int (*p)(),這個函數沒有參數,返回int型。從而這個表達式的含義是:定義了一個函數指針型的數組,大小是10??梢岳?/span>typedef來簡化這種定義:

typedef int (*PFV)();

PFV testCases[10];

其實int (*testCases[10])();這兒我們定義了一個函數指針數組,數組是主體。

?

下面考慮這樣的問題:如何定義一個指向數組的指針?

?? 指向數組的指針,好像比較新鮮,所謂指向數組的指針,即指針的一步跨越是一個數組,跟指向整型的指針一步跨越一個整型一個道理。事實上前面已經碰到了指向數組的指針,如二維數組名,實際上就是一個指向數組的指針,它一次跨越一行的數據,實際上即是跨越了一個一維數組,而三維數組名呢,也是一個指向數組的指針,它一次跨越的是低維組成的一個二維數組。

?? 數組指針(即指向數組的指針)的定義: int (*ptr)[3];?

?? 這個表達式定義了一個數組指針ptrptr一次跨越一個由3int型組成的一維數組。發現其定義的方式與函數指針定義的方式很相似,只是把()換作了[]。更進一步,如果要定義一個指向數組的指針,而數組中的元素不是簡單的int型,而是比較復雜的類型,那該如何定義呢?事實上數組指針這種東西就已經夠稀有的了,一般編程絕對不會用到,我們只需要能讀懂一些比較復雜的東西就行了,自己沒有必要構造這么復雜的類型。

?

比較復雜的表達式:

1、int (*(*(*p())[])())[];

?? 首先,根據p()判斷p是一個函數,再根據p()前面的*號判斷該函數返回一個指針,下面就看這個指針指向的是什么類型了,我們可以把*p()替換成一個*pointer,這個pointer就是函數p返回的指針,那么就成了int (*(*(*pointer)[])())[];再根據(*pointer)[],這說明了指針pointer是指向的一個數組,那么這個數組中的元素是什么類型呢?由于數組名實際上就是個指針,我們把(*pointer)[](即(*p())[])替換成一個array,這樣就成了 int (*(*array)())[];發現array是一個函數指針,從而數組中的每個元素是函數指針,而這個函數呢,又返回一個指針類型,把(*array)()func代替,就成了int (*func)[];這說明了func函數返回的是指向數組的指針,數組中的元素是int型。

這個表達式夠酷!!!

?

2p = (int( * (*)[20])[10])q;

?? 這是一個強制類型轉換,q被強制類型轉換成一個這樣的指針類型,這個指針呢直線一個具有20個元素的數組,這個數組中的元素也是指針,是指向另外一種數組,這種數組是含有10int型數據的一維數組。

?

?? 可見,分析復雜的表達式時(所謂復雜,即糅合了指針,數組,函數三樣,缺少了一樣就不會復雜了),從括號的最里層做起,最里層的東西是復雜表達式的根節點,然后一層一層脫,脫的時候,是這樣的,比如里層是個數組,那么就是說這個數組的元素是什么呢,那就是外層的東西,如果里層是個有返回值的函數,那么就是說這個函數返回什么值呢?那就是外層的東西,就這樣一層一層地把表達式解析清楚。

關于typedef還有一些要說的:

typedef? int (*PFV)(); 這是定義了一個函數指針,那么PFV p;就可以定義了一個指向函數的指針。

typedef int (*p[10])(); 這是把p定義為函數指針數組,那么 p array;語句就可以定義了一個函數指針數組,數組名即為arrayarray這個數組含10個元素。

typedef int (*parray)[3];這是定義了一個指向整型數組的指針,那么 parray ptr;就定義了一個指向數組的指針。如何對這個ptr賦值或者初始化呢?事實上,是通過二維數組名來對其進行賦值(初始化)的,因為二維數組名作為指針來講,就是一個指向數組的指針,一次跨越一個數組。

typedef int a[3][3]; 這個語句什么意思呢?這是把a定義為一個3*3的整型數組類型。當a b = {1}時就完成了一個3×3的整型數組的定義初始化的工作。

同樣,簡單一點 typedef int a[3];這個語句是把a定義為一個一維數組類型。

typedef? void func(int); 這個語句定義了一個函數類型。通過這個typedef,我們可以比較清晰地定義出函數指針,func* p;即可。

?

typedef char* string;

const string str;

這個str是什么類型的呢?const char * str,即指向常量的指針類型?事實上,答案有些不可思議,str是一個常量指針,而不是指針常量,即const修飾符針對的是指針,而不是char

?

轉載于:https://www.cnblogs.com/krisdy/archive/2009/06/15/1503689.html

總結

以上是生活随笔為你收集整理的[C++ rudiment][转]typedef 使用的全部內容,希望文章能夠幫你解決所遇到的問題。

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