亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 初學者必備:教你理解復雜的c c++聲明.txt

?? 介紹一些有關c/c++的文章 例如:VC++6.0 下搭建 wxWidgets 開發環境 最強大的.NET語言之對象構造 最強大的.NET語言之內存與資源 最強大的.NET語言之裝箱 C++
?? TXT
字號:
初學者必備:教你理解復雜的C/C++聲明 
 
 
文章錄入:7747.Net    責任編輯:7747.Net  更新時間:2006-9-21 10:38:10 1674 
 【字體:小 大】
 
 
曾經碰到過讓你迷惑不解、類似于int * (* (*fp1) (int) ) [10];這樣的變量聲明嗎?本文將由易到難,一步一步教會你如何理解這種復雜的C/C++聲明。我們將從每天都能碰到的較簡單的聲明入手,然后逐步加入const修飾符和typedef,還有函數指針,最后介紹一個能夠讓你準確地理解任何C/C++聲明的“右左法則”。需要強調一下的是,復雜的C/C++聲明并不是好的編程風格;這里僅僅是教你如何去理解這些聲明。

讓我們從一個非常簡單的例子開始,如下:


int n;
 

這個應該被理解為“declare n as an int”(n是一個int型的變量)。接下去來看一下指針變量,如下: 


int *p;
 

這個應該被理解為“declare p as an int *”(p是一個int *型的變量),或者說p是一個指向一個int型變量的指針。我想在這里展開討論一下:我覺得在聲明一個指針(或引用)類型的變量時,最好將*(或&)寫在緊靠變量之前,而不是緊跟基本類型之后。這樣可以避免一些理解上的誤區,比如: 


int*  p,q;
 

第一眼看去,好像是p和q都是int*類型的,但事實上,只有p是一個指針,而q是一個最簡單的int型變量。我們還是繼續我們前面的話題,再來看一個指針的指針的例子: 


char **argv;
 

理論上,對于指針的級數沒有限制,你可以定義一個浮點類型變量的指針的指針的指針的指針,再來看如下的聲明: 


int RollNum[30][4]; 

int (*p)[4]=RollNum; 

int *q[5];
 

這里,p被聲明為一個指向一個4元素(int類型)數組的指針,而q被聲明為一個包含5個元素(int類型的指針)的數組。另外,我們還可以在同一個聲明中混合實用*和&,如下: 


int **p1; 

// p1 is a pointer  to a pointer  to an int. 

int *&p2; 

// p2 is a reference to a pointer  to an int. 

int &*p3; 

// ERROR: Pointer  to a reference is illegal. 

int &&p4;

// ERROR: Reference to a reference is illegal.
 

注:p1是一個int類型的指針的指針;p2是一個int類型的指針的引用;p3是一個int類型引用的指針(不合法!);p4是一個int類型引用的引用(不合法!)。 

const修飾符 

當你想阻止一個變量被改變,可能會用到const關鍵字。在你給一個變量加上const修飾符的同時,通常需要對它進行初始化,因為以后的任何時候你將沒有機會再去改變它。例如: 


const int n=5; 

int const m=10;
 

上述兩個變量n和m其實是同一種類型的——都是const int(整形恒量)。因為C++標準規定,const關鍵字放在類型或變量名之前等價的。我個人更喜歡第一種聲明方式,因為它更突出了const修飾符的作用。當const與指針一起使用時,容易讓人感到迷惑。例如,我們來看一下下面的p和q的聲明: 


const int *p; 

int const *q;
 

他們當中哪一個代表const int類型的指針(const直接修飾int),哪一個代表int類型的const指針(const直接修飾指針)?實際上,p和q都被聲明為const int類型的指針。而int類型的const指針應該這樣聲明: 


int * const r= &n;

// n has been declared as an int
 

這里,p和q都是指向const int類型的指針,也就是說,你在以后的程序里不能改變*p的值。而r是一個const指針,它在聲明的時候被初始化指向變量n(即r=&n;)之后,r的值將不再允許被改變(但*r的值可以改變)。 

組合上述兩種const修飾的情況,我們來聲明一個指向const int類型的const指針,如下: 


const int * const p=&n 

// n has been declared as const int
 

下面給出的一些關于const的聲明,將幫助你徹底理清const的用法。不過請注意,下面的一些聲明是不能被編譯通過的,因為他們需要在聲明的同時進行初始化。為了簡潔起見,我忽略了初始化部分;因為加入初始化代碼的話,下面每個聲明都將增加兩行代碼。 


char ** p1; 

//    pointer to    pointer to    char 

const char **p2;

//    pointer to    pointer to const char 

char * const * p3;

//    pointer to const pointer to    char 

const char * const * p4;

//    pointer to const pointer to const char 

char ** const p5;

// const pointer to    pointer to    char 

const char ** const p6;

// const pointer to    pointer to const char 

char * const * const p7;

// const pointer to const pointer to    char 

const char * const * const p8;

// const pointer to const pointer to const char
 

注:p1是指向char類型的指針的指針;p2是指向const char類型的指針的指針;p3是指向char類型的const指針;p4是指向const char類型的const指針;p5是指向char類型的指針的const指針;p6是指向const char類型的指針的const指針;p7是指向char類型const指針的const指針;p8是指向const char類型的const指針的const指針。 

typedef的妙用 

typedef給你一種方式來克服“*只適合于變量而不適合于類型”的弊端。你可以如下使用typedef: 


typedef char * PCHAR; 

PCHAR p,q;
 

這里的p和q都被聲明為指針。(如果不使用typedef,q將被聲明為一個char變量,這跟我們的第一眼感覺不太一致!)下面有一些使用typedef的聲明,并且給出了解釋: 


typedef char * a;

// a is a pointer to a char 



typedef a b();

// b is a function that returns 

// a pointer to a char 



typedef b *c;

// c is a pointer to a function 

// that returns a pointer to a char 



typedef c d();

// d is a function returning 

// a pointer to a function 

// that returns a pointer to a char 



typedef d *e;

// e is a pointer to a function 

// returning a pointer to a 

// function that returns a 

// pointer to a char 



e var[10];

// var is an array of 10 pointers to 

// functions returning pointers to 

// functions returning pointers to chars.
 

typedef經常用在一個結構聲明之前,如下。這樣,當創建結構變量的時候,允許你不使用關鍵字struct(在C中,創建結構變量時要求使用struct關鍵字,如struct tagPOINT a;而在C++中,struct可以忽略,如tagPOINT b)。 


typedef struct tagPOINT 

{ 

  int x; 

  int y; 

}POINT; 



POINT p; /* Valid C code */
 



函數指針

函數指針可能是最容易引起理解上的困惑的聲明。函數指針在DOS時代寫TSR程序時用得最多;在Win32和X-Windows時代,他們被用在需要回調函數的場合。當然,還有其它很多地方需要用到函數指針:虛函數表,STL中的一些模板,Win NT/2K/XP系統服務等。讓我們來看一個函數指針的簡單例子:






int (*p)(char);
 

這里p被聲明為一個函數指針,這個函數帶一個char類型的參數,并且有一個int類型的返回值。另外,帶有兩個float類型參數、返回值是char類型的指針的指針的函數指針可以聲明如下: 


char ** (*p)(float, float);
 

那么,帶兩個char類型的const指針參數、無返回值的函數指針又該如何聲明呢?參考如下: 


void * (*a[5])(char * const, char * const);
 

“右左法則”是一個簡單的法則,但能讓你準確理解所有的聲明。這個法則運用如下:從最內部的括號開始閱讀聲明,向右看,然后向左看。當你碰到一個括號時就調轉閱讀的方向。括號內的所有內容都分析完畢就跳出括號的范圍。這樣繼續,直到整個聲明都被分析完畢。 

對上述“右左法則”做一個小小的修正:當你第一次開始閱讀聲明的時候,你必須從變量名開始,而不是從最內部的括號。 

下面結合例子來演示一下“右左法則”的使用。 


int * (* (*fp1) (int) ) [10];
 

閱讀步驟: 

1. 從變量名開始——fp1 

2. 往右看,什么也沒有,碰到了),因此往左看,碰到一個*——一個指針 

3. 跳出括號,碰到了(int)——一個帶一個int參數的函數 

4. 向左看,發現一個*——(函數)返回一個指針 

5. 跳出括號,向右看,碰到[10]——一個10元素的數組 

6. 向左看,發現一個*——指針 

7. 向左看,發現int——int類型 

總結:fp1被聲明成為一個函數的指針,該函數返回指向指針數組的指針. 

再來看一個例子: 


int *( *( *arr[5])())();
 

閱讀步驟: 

1. 從變量名開始——arr 

2. 往右看,發現是一個數組——一個5元素的數組 

3. 向左看,發現一個*——指針 

4. 跳出括號,向右看,發現()——不帶參數的函數 

5. 向左看,碰到*——(函數)返回一個指針 

6. 跳出括號,向右發現()——不帶參數的函數 

7. 向左,發現*——(函數)返回一個指針 

8. 繼續向左,發現int——int類型 

還有更多的例子: 


float ( * ( *b()) [] )();

// b is a function that returns a 

// pointer to an array of pointers 

// to functions returning floats. 

void * ( *c) ( char, int (*)());

// c is a pointer to a function that takes 

// two parameters: 

// a char and a pointer to a 

// function that takes no 

// parameters and returns 

// an int 

// and returns a pointer to void. 

void ** (*d) (int &, 

char **(*)(char *, char **));

// d is a pointer to a function that takes 

// two parameters: 

// a reference to an int and a pointer 

// to a function that takes two parameters: 

// a pointer to a char and a pointer 

// to a pointer to a char 

// and returns a pointer to a pointer 

// to a char 

// and returns a pointer to a pointer to void 

float ( * ( * e[10]) 

  (int &) ) [5];

// e is an array of 10 pointers to 

// functions that take a single 

// reference to an int as an argument 

// and return pointers to 

// an array of 5 floats.
 
 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕在线免费不卡| 亚洲色图另类专区| 97se亚洲国产综合自在线观| 午夜欧美大尺度福利影院在线看| 亚洲精品在线免费播放| 欧美影院午夜播放| 成人中文字幕在线| 99精品一区二区| 麻豆视频观看网址久久| 亚洲欧洲av另类| 久久久久9999亚洲精品| 欧美日韩第一区日日骚| 中文字幕精品一区二区精品绿巨人 | 777a∨成人精品桃花网| 亚洲国产视频直播| 国产乱妇无码大片在线观看| 亚洲午夜在线视频| 国产精品美女久久久久av爽李琼| 欧美一区二区三区人| 欧美性受极品xxxx喷水| 99国产精品久久久久久久久久| 日韩vs国产vs欧美| 一二三四社区欧美黄| 亚洲欧洲99久久| 国产精品欧美一区二区三区| 亚洲精品一区二区精华| 日韩色在线观看| 911国产精品| 欧美日韩高清一区二区| 色94色欧美sute亚洲线路一久 | 欧美优质美女网站| 99久久精品免费| aaa欧美大片| 北条麻妃一区二区三区| 国产成a人亚洲| 国产91精品入口| 高清成人在线观看| 成人av在线一区二区三区| 国产.欧美.日韩| 大尺度一区二区| caoporm超碰国产精品| 国产a久久麻豆| 不卡电影免费在线播放一区| 成人一区在线看| heyzo一本久久综合| 成人精品小蝌蚪| 91在线观看地址| 91国偷自产一区二区三区成为亚洲经典 | 秋霞电影网一区二区| 偷拍一区二区三区四区| 午夜精品福利一区二区三区av | 福利电影一区二区三区| 粉嫩蜜臀av国产精品网站| 成人精品国产一区二区4080| 成人免费观看视频| 91在线国产福利| 97久久人人超碰| 欧美午夜不卡视频| 555www色欧美视频| 久久天天做天天爱综合色| 国产丝袜在线精品| 亚洲视频网在线直播| 亚洲妇女屁股眼交7| 免费在线观看成人| 国产精品中文有码| 91麻豆蜜桃一区二区三区| 欧美日韩aaaaaa| 久久一夜天堂av一区二区三区| 日本一区二区在线不卡| 伊人色综合久久天天| 日本不卡的三区四区五区| 激情综合网激情| 99久久99久久综合| 欧美日韩中字一区| 欧美理论片在线| 亚洲欧洲制服丝袜| 一区二区三区日韩欧美| 天天综合色天天综合| 一区二区在线观看免费视频播放| 在线播放一区二区三区| 欧美电影免费观看高清完整版在线| 日韩一级完整毛片| 久久综合久久鬼色中文字| 国产一区二区三区高清播放| 天堂va蜜桃一区二区三区 | 日韩一区精品视频| 在线欧美日韩国产| 精品久久久久一区| 亚洲综合激情小说| 欧美视频中文一区二区三区在线观看 | 免费人成在线不卡| 欧美日韩在线综合| 亚洲自拍欧美精品| 欧美一区二区不卡视频| 久久久久成人黄色影片| 日本美女一区二区三区视频| 在线视频国产一区| 亚洲国产精品自拍| 欧美日本视频在线| 国产一区二区调教| 国产日产欧美一区二区视频| 久色婷婷小香蕉久久| 2020日本不卡一区二区视频| 不卡的av在线| 26uuu精品一区二区| 奇米888四色在线精品| 精品欧美乱码久久久久久1区2区| 日韩精品国产精品| 国产欧美视频一区二区| 99久久国产综合精品色伊| 樱桃国产成人精品视频| 欧美午夜不卡在线观看免费| 看电影不卡的网站| 夜夜揉揉日日人人青青一国产精品| 亚洲成人自拍网| 欧美精品一区二区三区视频| 国产精品99久久久| 五月婷婷欧美视频| 国产精品欧美综合在线| 欧美日本一区二区三区四区| 狠狠色丁香久久婷婷综合丁香| 亚洲免费伊人电影| 久久综合中文字幕| 蜜臀a∨国产成人精品| 精品日产卡一卡二卡麻豆| 99精品视频免费在线观看| 日韩高清在线观看| 亚洲精品v日韩精品| 久久久久久久精| 欧美精品高清视频| 成人在线一区二区三区| 久久99久国产精品黄毛片色诱| 亚洲一区二区三区中文字幕| 久久精品一区二区三区不卡牛牛| 偷偷要91色婷婷| 亚洲色图清纯唯美| 国产精品人人做人人爽人人添| 日韩欧美一二三四区| 欧美视频一区二区在线观看| 99久久精品国产精品久久| 国产成人欧美日韩在线电影| 美国三级日本三级久久99| 亚洲一区二区三区中文字幕| 中文字幕中文字幕一区| 亚洲色图20p| 日本二三区不卡| 成人高清视频免费观看| 国产福利电影一区二区三区| 国产一区二区三区在线观看免费视频 | 成人免费福利片| 国产精品自拍网站| 国产伦精品一区二区三区在线观看| 美女视频一区二区三区| 久久亚区不卡日本| 欧美卡1卡2卡| 日韩写真欧美这视频| 久久久久亚洲综合| 国产精品的网站| 亚洲一区二区三区四区在线观看| 亚洲一区二区三区视频在线播放 | 久久久久久久久岛国免费| 亚洲欧洲美洲综合色网| 欧美视频精品在线观看| 91香蕉视频在线| 4438成人网| 国产精品乱人伦| 视频一区欧美精品| 国产传媒日韩欧美成人| 在线观看网站黄不卡| 日韩写真欧美这视频| 亚洲欧洲美洲综合色网| 人禽交欧美网站| 欧美自拍偷拍午夜视频| 久久精品视频免费观看| 亚洲色图19p| 欧美一二三四区在线| 欧美一区二区三区四区五区| 中文字幕一区二区三区在线观看 | 捆绑变态av一区二区三区| 99久久久精品| 国产日产欧美一区二区视频| 午夜天堂影视香蕉久久| 99精品在线观看视频| 欧美高清在线一区二区| 久久久久亚洲综合| 欧美人成免费网站| 亚洲精品视频在线观看免费| 国产在线观看一区二区| 精品三级av在线| 精品一区二区在线观看| 欧美一区二区啪啪| 天天色天天爱天天射综合| 欧美日本一区二区| 奇米影视一区二区三区| 国产伦精一区二区三区| 紧缚奴在线一区二区三区| 一区二区三区高清| 91在线视频观看| 亚洲国产成人一区二区三区| 成人性生交大合|