青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 297,  comments - 15,  trackbacks - 0

一.基本概念剖析

int* (*a[5])(int, char*);      //#1
void (*b[10]) (void (*)()); //#2
double(*)() (*pa)[9];         //#3 

1.C語言中函數聲明和數組聲明。函數聲明一般是這樣:

  int fun(int, double);

對應函數指針(pointer to function)的聲明是這樣:

  int (*pf)(int, double);

可以這樣使用:

pf = &fun; //賦值(assignment)操作
(*pf)(5, 8.9);//函數調用操作

也請注意,C語言本身提供了一種簡寫方式如下:
pf = fun;       // 賦值(assignment)操作
pf(5, 8.9);     // 函數調用操作
不過我本人不是很喜歡這種簡寫,它對初學者帶來了比較多的迷惑。
數組聲明一般是這樣:

int a[5];
對于數組指針(pointer to array)的聲明是這樣:
int (*pa)[5];

可以這樣使用:

pa = &a; // 賦值(assignment)操作
int i = (*pa)[2]; // 將a[2]賦值給i;

2.有了上面的基礎,我們就可以對付開頭的三只紙老虎了!:) 這個時候你需要復習一下各種運算符的優先順序和結合順序了,順便找本書看看就夠了。
#1:int* (*a[5])(int, char*);
首先看到標識符名a,“[]”優先級大于“*”,a與“[5]”先結合。所以a是一個數組,這個數組有5個元素,每一個元素都是一個指針,
指針指向“(int, char*)”,對,指向一個函數,函數參數是“int, char*”,返回值是“int*”。完畢,我們干掉了第一個紙老虎。:)
#2:void (*b[10]) (void (*)());
b是一個數組,這個數組有10個元素,每一個元素都是一個指針,指針指向一個函數,函數參數是“void (*)()”【注1】,返回值是“void”。完畢!
注1:這個參數又是一個指針,指向一個函數,函數參數為空,返回值是“void”。
#3:double(*)()(*pa)[9];
pa是一個指針,指針指向一個數組,這個數組有9個元素,每一個元素都是“double(*)()”【也即一個指針,指向一個函數,函數參數為空,返回值是“double”】。(注意typedef int* p[9]與typedef int(*p)[9]的區別,前者定義一個數組,此數組包含9個int*類型成員,而后者定義一個指向數組的指針,被指向的數組包含9個int類型成員)。
現在是不是覺得要認識它們是易如反掌,工欲善其事,必先利其器!我們對這種表達方式熟悉之后,就可以用“typedef”來簡化這種類型聲明。

#1:int* (*a[5])(int, char*);

  typedef int* (*PF)(int, char*);//PF是一個類型別名【注2】。
PF a[5];//跟int* (*a[5])(int, char*);的效果一樣!
注2:很多初學者只知道typedef char* pchar;但是對于typedef的其它用法不太了解。Stephen Blaha對typedef用法做過一個總結:“建立一個類型別名的方法很簡單,在傳統的變量聲明表達式里用類型名替代變量名,然后把關鍵字 typedef加在該語句的開頭”。

#2:void (*b[10])(void (*)());

  typedef void (*pfv)();
typedef void (*pf_taking_pfv)(pfv);
pf_taking_pfv b[10]; //跟void (*b[10]) (void (*)());的效果一樣! 

#3. double(*)()(*pa)[9];
  typedef double(*PF)();
typedef PF (*PA)[9];
PA pa; //跟doube(*)()(*pa)[9];的效果一樣! 

3.const和volatile在類型聲明中的位置。
在這里我只說const,volatile是一樣的!【注3】
注3:顧名思義,volatile修飾的量就是很容易變化,不穩定的量,它可能被其它線程,操作系統,硬件等等在未知的時間改變,
所以它被存儲在內存中,每次取用它的時候都只能在內存中去讀取,它不能被編譯器優化放在內部寄存器中。
類型聲明中const用來修飾一個常量,我們一般這樣使用:const在前面:

  const int; //int是const
const char*;//char是const
char* const;//*(指針)是const
const char* const;//char和*都是const 
對初學者,const char*和 char* const是容易混淆的。這需要時間的歷練讓你習慣它。 上面的聲明有一個對等的寫法:const在后面:
  int const; //int是const
char const*;//char是const
char* const;//*(指針)是const
char const* const;//char和*都是const 
第一次你可能不會習慣,但新事物如果是好的,我們為什么要拒絕它呢?:)const在后面有兩個好處:

A.const所修飾的類型正好是在它前面的那一個。如果這個好處還不能讓你動心的話,那請看下一個!
B.我們很多時候會用到typedef的類型別名定義。比如typedef char* pchar,如果用const來修飾的話,
當const在前面的時候,就是const pchar,你會以為它就是const char* ,但是你錯了,它的真實含義是char* const。

是不是讓你大吃一驚!但如果你采用const在后面的寫法,意義就怎么也不會變,不信你試試!
不過,在真實項目中的命名一致性更重要。你應該在兩種情況下都能適應,并能自如的轉換,公司習慣,
商業利潤不論在什么時候都應該優先考慮!不過在開始一個新項目的時候,你可以考慮優先使用const在后面的習慣用法。

二.Typedef聲明有助于創建平臺無關類型,甚至能隱藏復雜和難以理解的語法。

不管怎樣,使用 typedef 能為代碼帶來意想不到的好處,通過本文你可以學習用typedef避免缺欠,從而使代碼更健壯。
typedef聲明,簡稱typedef,為現有類型創建一個新的名字。比如人們常常使用 typedef 來編寫更美觀和可讀的代碼。
所謂美觀,意指typedef 能隱藏笨拙的語法構造以及平臺相關的數據類型,從而增強可移植性和以及未來的可維護性。
本文下面將竭盡全力來揭示 typedef 強大功能以及如何避免一些常見的陷阱,如何創建平臺無關的數據類型,隱藏笨拙且難以理解的語法.
typedef使用最多的地方是創建易于記憶的類型名,用它來歸檔程序員的意圖。類型出現在所聲明的變量名字中,位于typedef關鍵字右邊。
例如:

typedef int size;

此聲明定義了一個 int 的同義字,名字為 size。注意typedef并不創建新的類型。它僅僅為現有類型添加一個同義字。
你可以在任何需要 int 的上下文中使用 size:

  void measure(size * psz);
size array[4];
size len = file.getlength(); 
typedef 還可以掩飾復合類型,如指針和數組。例如,你不用象下面這樣重復定義有81個字符元素的數組:
char line[81]; char text[81];
定義一個typedef,每當要用到相同類型和大小的數組時,可以這樣:
  typedef char Line[81];
Line text, secondline;
getline(text);
同樣,可以象下面這樣隱藏指針語法:
  typedef char * pstr;
int mystrcmp(pstr, pstr);  
這里將帶我們到達第一個 typedef 陷阱。標準函數 strcmp()有兩個const char *類型的參數。因此,它可能會誤導人們象下面這樣聲明:
int mystrcmp(const pstr, const pstr);
這是錯誤的,事實上,const pstr被編譯器解釋為char * const(一個指向 char 的常量指針),而不是const char *(指向常量 char 的指針)。
這個問題很容易解決:
  typedef const char * cpstr;
int mystrcmp(cpstr, cpstr);
上面討論的 typedef 行為有點像 #define 宏,用其實際類型替代同義字。不同點是typedef在編譯時被解釋
,因此讓編譯器來應付超越預處理器能力的文本替換。例如:
  typedef int (*PF) (const char *, const char *);
這個聲明引入了 PF 類型作為函數指針的同義字,該函數有兩個 const char * 類型的參數以及一個 int 類型的返回值。如果要使用下列形式的函數聲明,那么上述這個 typedef 是不可或缺的:
  PF Register(PF pf);
Register()的參數是一個PF類型的回調函數,返回某個函數的地址,其署名與先前注冊的名字相同。做一次深呼吸。下面我展示一下如果不用 typedef,我們是如何實現這個聲明的:

int (*Register (int (*pf)(const char *, const char *))) (const char *, const char *);

很少有程序員理解它是什么意思,更不用說這種費解的代碼所帶來的出錯風險了。顯然,這里使用 typedef 不是一種特權,
而是一種必需。typedef 就像 auto,extern,mutable,static,和 register 一樣,是一個存儲類關鍵字。
這并不是說typedef會真正影響對象的存儲特性;它只是說在語句構成上,typedef 聲明看起來象 static,extern 等類型的變量聲明。
下面將帶到第二個陷阱:
  typedef register int FAST_COUNTER; // 錯誤編譯通不過
問題出在你不能在聲明中有多個存儲類關鍵字。因為符號 typedef 已經占據了存儲類關鍵字的位置,
在 typedef 聲明中不能用 register(或任何其它存儲類關鍵字)。typedef 有另外一個重要的用途,那就是定義機器無關的類型,
例如,你可以定義一個叫 REAL 的浮點類型,在目標機器上它可以獲得最高的精度:

typedef long double REAL;

在不支持 long double 的機器上,該 typedef 看起來會是下面這樣:

typedef double REAL;

并且,在連 double 都不支持的機器上,該 typedef 看起來會是這樣:

typedef float REAL;

你不用對源代碼做任何修改,便可以在每一種平臺上編譯這個使用 REAL 類型的應用程序。唯一要改的是 typedef 本身。
在大多數情況下,甚至這個微小的變動完全都可以通過奇妙的條件編譯來自動實現。不是嗎?
標準庫廣泛地使用 typedef 來創建這樣的平臺無關類型:size_t,ptrdiff 和 fpos_t 就是其中的例子。
此外,象 std::string 和 std::ofstream 這樣的 typedef 還隱藏了長長的,難以理解的模板特化語法,
例如:basic_string,allocator> 和 basic_ofstream>。

posted on 2009-03-27 11:19 chatler 閱讀(318) 評論(0)  編輯 收藏 引用 所屬分類: C++_BASIS
<2009年12月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感覺這個博客還是不錯,雖然做的東西和我不大相關,覺得看看還是有好處的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一本色道久久88精品综合| 国产综合视频| 中文一区字幕| 99热在这里有精品免费| 欧美性一区二区| 久久久久免费观看| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲激情亚洲| 99成人免费视频| 国产日韩欧美高清| 欧美高清日韩| 国产精品国产自产拍高清av王其| 欧美亚洲一区二区在线观看| 久久riav二区三区| 99国产精品国产精品久久| 在线综合亚洲欧美在线视频| 国内精品久久久久影院色| 亚洲国产精品嫩草影院| 欧美日韩视频一区二区| 久久精品国产91精品亚洲| 猛男gaygay欧美视频| 亚洲一区二区视频| 久久免费视频网站| 亚洲尤物精选| 免费人成网站在线观看欧美高清| 亚洲午夜小视频| 久久久久久综合网天天| 亚洲一区二区网站| 六月天综合网| 欧美亚洲一区在线| 欧美日韩精品免费观看视频| 久久午夜视频| 国产精品久久久久高潮| 亚洲激情视频| 一本色道久久综合精品竹菊| 久久人体大胆视频| 午夜一区二区三区在线观看| 免费试看一区| 久久人人九九| 国产精品婷婷午夜在线观看| 亚洲精品一区二区在线观看| 黄色成人小视频| 亚洲欧美精品在线观看| 99re6这里只有精品| 久久中文欧美| 久久先锋资源| 国产主播一区| 午夜久久一区| 欧美一区二区三区久久精品| 欧美视频不卡| 99精品欧美一区二区蜜桃免费| 亚洲精品国产系列| 美女在线一区二区| 男女av一区三区二区色多| 国产综合色在线视频区| 欧美淫片网站| 久久综合色8888| 狠狠网亚洲精品| 久久精品色图| 老司机一区二区三区| 国产一区二区三区精品久久久| 亚洲男人av电影| 欧美主播一区二区三区美女 久久精品人 | 欧美一区二区高清| 国产精品区二区三区日本| 亚洲午夜久久久| 亚洲欧美另类在线| 国产欧美日韩精品丝袜高跟鞋| 亚洲欧美成aⅴ人在线观看| 亚洲欧美精品一区| 国产日韩欧美夫妻视频在线观看| 亚洲综合激情| 久久亚洲午夜电影| 亚洲国产91| 欧美黄色大片网站| 一区二区免费在线观看| 欧美一区二区三区视频在线 | 欧美视频免费在线| 亚洲在线视频网站| 久久精品人人做人人爽电影蜜月| 精品成人a区在线观看| 免费久久精品视频| 99热这里只有精品8| 久久成人亚洲| 91久久久精品| 国产精品video| 欧美伊人久久| 亚洲欧洲日本专区| 亚洲欧美国产毛片在线| 国内外成人免费激情在线视频| 麻豆精品视频在线观看| 亚洲精品久久在线| 欧美一区二区三区婷婷月色| 一色屋精品视频免费看| 欧美日产在线观看| 久久不射电影网| 日韩午夜一区| 久久亚裔精品欧美| 亚洲国产成人午夜在线一区| 久久久久久久网站| 亚洲欧美在线一区| 国产精品久久久久久久第一福利 | 久久资源av| 久久久精品国产免费观看同学| 欧美性做爰猛烈叫床潮| 欧美在线免费观看亚洲| 亚洲全部视频| 久久国产一区二区| 夜久久久久久| 在线看成人片| 国产精品欧美一区二区三区奶水| 久久综合久久综合久久综合| 国产精品99久久久久久有的能看| 麻豆国产va免费精品高清在线| 亚洲一级电影| 亚洲人成网站999久久久综合| 国产亚洲视频在线| 欧美揉bbbbb揉bbbbb| 美女日韩在线中文字幕| 羞羞视频在线观看欧美| 日韩亚洲在线观看| 亚洲国产精品女人久久久| 久久久天天操| 久久激情视频久久| 亚洲欧美日本另类| 中国av一区| 99热免费精品| 亚洲麻豆av| 亚洲国产另类精品专区 | 久久久蜜臀国产一区二区| 亚洲欧美美女| 亚洲综合视频一区| 中文久久精品| 一二三四社区欧美黄| 亚洲精品综合| 亚洲精品久久久久久久久| 亚洲国产天堂久久国产91| 欧美大片一区二区| 欧美国产1区2区| 欧美激情一区二区三区成人| 欧美成人首页| 亚洲高清久久久| 亚洲国产高清aⅴ视频| 亚洲大胆视频| 亚洲韩国日本中文字幕| 亚洲国产精品久久久久| 亚洲精品日韩综合观看成人91| 亚洲区在线播放| 日韩一区二区精品| 亚洲视频免费在线| 亚洲男女自偷自拍| 久久精品国产69国产精品亚洲 | 99精品国产在热久久婷婷| 在线视频亚洲| 午夜日韩电影| 久久久久久尹人网香蕉| 欧美成人在线免费视频| 欧美日韩国产三级| 国产精品久久久久久av下载红粉 | 亚洲电影在线看| 亚洲人成网站色ww在线| 亚洲午夜影视影院在线观看| 午夜精品免费在线| 欧美视频专区一二在线观看| 国产美女搞久久| 国产欧美短视频| 今天的高清视频免费播放成人 | 亚洲高清视频在线| 一区二区三区免费网站| 久久gogo国模裸体人体| 欧美阿v一级看视频| 日韩午夜激情电影| 欧美专区日韩视频| 欧美久久久久中文字幕| 国产日韩精品电影| 亚洲茄子视频| 久久国产精品99国产| 亚洲国产精品一区二区第一页 | 国产精品麻豆成人av电影艾秋| 国产综合久久久久影院| 99国产精品久久| 久久精品九九| 亚洲精品一区二区三区樱花| 香港久久久电影| 欧美精品色综合| 一区二区三区在线视频播放| 亚洲无毛电影| 欧美黄色网络| 欧美一区二区在线看| 欧美日韩国产免费| 怡红院av一区二区三区| 欧美怡红院视频| 99视频有精品| 欧美成人免费va影院高清| 国产一区二区三区高清播放| 亚洲午夜久久久| 亚洲国产精品久久久| 久久精品一区二区三区中文字幕| 国产精品av免费在线观看| 亚洲日本国产|