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

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

?? c++從零開始(五)——何謂指針.txt

?? 介紹一些有關c/c++的文章 例如:VC++6.0 下搭建 wxWidgets 開發環境 最強大的.NET語言之對象構造 最強大的.NET語言之內存與資源 最強大的.NET語言之裝箱 C++
?? TXT
?? 第 1 頁 / 共 2 頁
字號:
C++從零開始(五)——何謂指針 
 
 
文章錄入:7747.Net    責任編輯:7747.Net  更新時間:2008-10-7 23:58:14 382 
 【字體:小 大】
 
 
C++從零開始(五)——何謂指針
原始出處:網絡

本篇說明C++中的重中又重的關鍵——指針類型,并說明兩個很有意義的概念——靜態和動態。

數組

前面說了在C++中是通過變量來對內存進行訪問的,但根據前面的說明,C++中只能通過變量來操作內存,也就是說要操作某塊內存,就必須先將這塊內存的首地址和一個變量名綁定起來,這是很糟糕的。比如有100塊內存用以記錄100個工人的工資,現在要將每個工人的工資增加5%,為了知道各個工人增加了后的工資為多少,就定義一個變量float a1;,用其記錄第1個工人的工資,然后執行語句a1 += a1 * 0.05f;,則a1里就是增加后的工資。由于是100個工人,所以就必須有100個變量,分別記錄100個工資。因此上面的賦值語句就需要有100條,每條僅僅變量名不一樣。
上面需要手工重復書寫變量定義語句float a1;100遍(每次變一個變量名),無謂的工作。因此想到一次向操作系統申請100*4=400個字節的連續內存,那么要給第i個工人修改工資,只需從首地址開始加上4*i個字節就行了(因為float占用4個字節)。
為了提供這個功能,C++提出了一種類型——數組。數組即一組數字,其中的各個數字稱作相應數組的元素,各元素的大小一定相等(因為數組中的元素是靠固定的偏移來標識的),即數組表示一組相同類型的數字,其在內存中一定是連續存放的。在定義變量時,要表示某個變量是數組類型時,在變量名的后面加上方括號,在方括號中指明欲申請的數組元素個數,以分號結束。因此上面的記錄100個工資的變量,即可如下定義成數組類型的變量:
float a[100];
上面定義了一個變量a,分配了100*4=400個字節的連續內存(因為一個float元素占用4個字節),然后將其首地址和變量名a相綁定。而變量a的類型就被稱作具有100個float類型元素的數組。即將如下解釋變量a所對應內存中的內容(類型就是如何解釋內存的內容):a所對應的地址標識的內存是一塊連續內存的首地址,這塊連續內存的大小剛好能容納下100個float類型的數字。
因此可以將前面的float b;這種定義看成是定義了一個元素的float數組變量b。而為了能夠訪問數組中的某個元素,在變量名后接方括號,方括號中放一數字,數字必須是非浮點數,即使用二進制原碼或補碼進行表示的數字。如a[ 5 + 3 ] += 32;就是數組變量a的第5 + 3個元素的值增加32。又:
long c = 23; float b = a[ ( c – 3 ) / 5 ] + 10, d = a[ c – 23 ];
上面的b的值就為數組變量a的第4個元素的值加10,而d的值就為數組變量a的第0個元素的值。即C++的數組中的元素是以0為基本序號來記數的,即a[0]實際代表的是數組變量a中的第一個元素的值,而之所以是0,表示a所對應的地址加上0*4后得到的地址就為第一個元素的地址。
應該注意不能這樣寫:long a[0];,定義0個元素的數組是無意義的,編譯器將報錯,不過在結構或類或聯合中符合某些規則后可以這樣寫,那是C語言時代提出的一種實現結構類型的長度可變的技術,在《C++從零開始(九)》中將說明。
還應注意上面在定義數組時不能在方括號內寫變量,即long b = 10; float a[ b ];是錯誤的,因為編譯此代碼時,無法知道變量b的值為多少,進而無法分配內存。可是前面明明已經寫了b = 10;,為什么還說不知道b的值?那是因為無法知道b所對應的地址是多少。因為編譯器編譯時只是將b和一個偏移進行了綁定,并不是真正的地址,即b所對應的可能是Base - 54,而其中的Base就是在程序一開始執行時動態向操作系統申請的大塊內存的尾地址,因為其可能變化,故無法得知b實際對應的地址(實際在Windows平臺下,由于虛擬地址空間的運用,是可以得到實際對應的虛擬地址,但依舊不是實際地址,故無法編譯時期知道某變量的值)。
但是編譯器仍然可以根據前面的long b = 10;而推出Base - 54的值為10啊?重點就是編譯器看到long b = 10;時,只是知道要生成一條指令,此指令將10放入Base - 54的內存中,其它將不再過問(也沒必要過問),故即使才寫了long b = 10;編譯器也無法得知b的值。
上面說數組是一種類型,其實并不準確,實際應為——數組是一種類型修飾符,其定義了一種類型修飾規則。關于類型修飾符,后面將詳述。


字符串

在《C++從零開始(二)》中已經說過,要查某個字符對應的ASCII碼,通過在這個字符的兩側加上單引號,如'A'就等同于65。而要表示多個字符時,就使用雙引號括起來,如:"ABC"。而為了記錄字符,就需要記錄下其對應的ASCII碼,而ASCII碼的數值在-128到127以內,因此使用一個char變量就可以記錄一個ASCII碼,而為了記錄"ABC",就很正常地使用一個char的數組來記錄。如下:
char a = 'A'; char b[10]; b[0] = 'A'; b[1] = 'B'; b[2] = 'C';
上面a的值為65,b[0]的值為65,b[1]為66,b[2]為67。因為b為一個10元素的數組,在這其記錄了一個3個字符長度的字符串,但是當得到b的地址時,如何知道其第幾個元素才是有效的字符?如上面的b[4]就沒有賦值,那如何知道b[4]不應該被解釋為字符?可以如下,從第0個元素開始依次檢查每個char元素的值,直到遇到某個char元素的值為0(因為ASCII碼表中0沒有對應的字符),則其前面的所有的元素都認為是應該用ASCII碼表來解釋的字符。故還應b[3] = 0;以表示字符串的結束。
上面的規則被廣泛運用,C運行時期庫中提供的所有有關字符串的操作都是基于上面的規則來解釋字符串的(關于C運行時期庫,可參考《C++從零開始(十九)》)。但上面為了記錄一個字符串,顯得煩瑣了點,字符串有多長就需要寫幾個賦值語句,而且還需要將末尾的元素賦值為0,如果搞忘則問題嚴重。對于此,C++強制提供了一種簡寫方式,如下:
char b[10] = "ABC";
上面就等效于前面所做的所有工作,其中的"ABC"是一個地址類型的數字(準確的說是一初始化表達式,在《C++從零開始(九)》中說明),其類型為char[4],即一個4個元素的char數組,多了一個末尾元素用于放0來標識字符串的結束。應當注意,由于b為char[10],而"ABC"返回的是char[4],類型并不匹配,需要隱式類型轉換,但實際沒有進行轉換,而是做了一系列的賦值操作(就如前面所做的工作),這是C++硬性規定的,稱為初始化,且僅僅對于數組定義時進行初始化有效,即如下是錯誤的:
char b[10]; b = "ABC";
而即使是char b[4]; b = "ABC";也依舊錯誤,因為b的類型是數組,表示的是多個元素,而對多個元素賦值是未定義的,即:float d[4]; float dd[4] = d;也是錯誤的,因為沒定義d中的元素是依次順序放到dd中的相應各元素,還是倒序放到,所以是不能對一個數組類型的變量進行賦值的。
由于現在字符的增多(原來只用英文字母,現在需要能表示中文、日文等多種字符),原來使用char類型來表示字符,最多也只能表示255種字符(0用來表示字符串結束),所以出現了所謂的多字節字符串(MultiByte),用這種表示方式記錄的文本文件稱為是MBCS格式的,而原來使用char類型進行表示的字符串稱為單字節字符串(SingleByte),用這種表示方式記錄的文本文件稱為是ANSI格式的。
由于char類型可以表示負數,則當從字符串中提取字符時,如果所得元素的數值是負的,則將此元素和下一個char元素聯合起來形成一short類型的數字,再按照Unicode編碼規則(一種編碼規則,等同于前面提過的ASCII碼表)來解釋這個short類型的數字以得到相應的字符。
而上面的"ABC"返回的就是以多字節格式表示的字符串,因為沒有漢字或特殊符號,故好象是用單字節格式表示的,但如果:char b[10] = "AB漢C";,則b[2]為-70,b[5]為0,而不是想象的由于4個字符故b[4]為0,因為“漢”這個字符占用了兩個字節。
上面的多字節格式的壞處是每個字符的長度不固定,如果想取字符串中的第3個字符的值,則必須從頭開始依次檢查每個元素的值而不能是3乘上某個固定長度,降低了字符串的處理速度,且在顯示字符串時由于需要比較檢查當前字符的值是否小于零而降低效率,故又推出了第三種字符表示格式:寬字節字符串(WideChar),用這種表示方式記錄的文本文件稱為是Unicode格式的。其與多字節的區別就是不管這個字符是否能夠用ASCII表示出來,都用一個short類型的數字來表示,即每個字符的長度固定為2字節,C++對此提供了支持。
short b[10] = L"AB漢C";
在雙引號的前面加上“L”(必須是大寫的,不能小寫)即告訴編譯器此雙引號內的字符要使用Unicode格式來編碼,故上面的b數組就是使用Unicode來記錄字符串的。同樣,也有:short c = L'A';,其中的c為65。
如果上面看得不是很明白,不要緊,在以后舉出的例子中將會逐漸了解字符串的使用的。


靜態和動態

上面依然沒有解決根本問題——C++依舊只能通過變量這個映射元素來訪問內存,在訪問某塊內存前,一定要先建立相應的映射,即定義變量。有什么壞處?讓我們先來了解靜態和動態是什么意思。
收銀員開發票,手動,則每次開發票時,都用已經印好的發票聯給客人開發票,發票聯上只印了4個格子用以記錄商品的名稱,當客人一次買的商品超過4種以上時,就必須開兩張或多張發票。這里發票聯上的格子的數量就被稱作靜態的,即無論任何時候任何客人買東西,開發票時發票聯上都印著4個記錄商品名稱用的格子。
超市的收銀員開發票,將商品名稱及數量等輸入電腦,然后即時打印出一張發票給客人,則不同的客人,打印出的發票的長度可能不同(有的客人買得多而有的少),此時發票的長度就稱為動態的,即不同時間不同客人買東西,開出的發票長度可能不同。
程序無論執行多少遍,在申請內存時總是申請固定大小的內存,則稱此內存是靜態分配的。前面提出的定義變量時,編譯器幫我們從棧上分配的內存就屬于靜態分配。每次執行程序,根據用戶輸入的不同而可能申請不同大小的內存時,則稱此內存是動態分配的,后面說的從堆上分配就屬于動態分配。
很明顯,動態比靜態的效率高(發票長度的利用率高),但要求更高——需要電腦和打印機,且需要收銀員的素質較高(能操作電腦),而靜態的要求就較低,只需要已經印好的發票聯,且也只需收銀員會寫字即可。
同樣,靜態分配的內存利用率不高或運用不夠靈活,但代碼容易編寫且運行速度較快;動態分配的內存利用率高,不過編寫代碼時要復雜些,需自己處理內存的管理(分配和釋放)且由于這種管理的介入而運行速度較慢并代碼長度增加。
靜態和動態的意義不僅僅如此,其有很多的深化,如硬編碼和軟編碼、緊耦合和松耦合,都是靜態和動態的深化。


地址

前面說過“地址就是一個數字,用以唯一標識某一特定內存單元”,而后又說“而地址就和長整型、單精度浮點數這類一樣,是數字的一種類型”,那地址既是數字又是數字的類型?不是有點矛盾嗎?如下:
浮點數是一種數——小數——又是一種數字類型。即前面的前者是地址實際中的運用,而后者是由于電腦只認識狀態,但是給出的狀態要如何處理就必須通過類型來說明,所以地址這種類型就是用來告訴編譯器以內存單元的標識來處理對應的狀態。


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人av电影在线| 一区二区三区欧美日| 久草中文综合在线| 国产精品主播直播| 91免费视频大全| 欧美精品日韩精品| 国产亚洲欧美日韩日本| 一区二区三区在线视频观看| 日本在线不卡视频一二三区| 国产91精品免费| 欧美午夜精品理论片a级按摩| 日韩女优毛片在线| 国产精品免费丝袜| 午夜精品久久久久久久99樱桃| 精彩视频一区二区三区| 色哟哟一区二区三区| 欧美电影免费观看高清完整版在线观看| 国产午夜精品美女毛片视频| 亚洲综合色视频| 国产美女精品在线| 欧美色视频在线观看| 欧美激情一区二区在线| 丝袜国产日韩另类美女| 成人av网在线| 丝袜美腿亚洲综合| 成人夜色视频网站在线观看| 欧美精品乱码久久久久久| 中文字幕欧美三区| 麻豆久久久久久久| 91国产免费看| 国产日产亚洲精品系列| 日韩av一区二区三区| 色综合久久久久综合体| 久久免费视频一区| 青青草成人在线观看| 91麻豆精品在线观看| 久久精品欧美日韩精品| 奇米色777欧美一区二区| 色伊人久久综合中文字幕| 久久综合色播五月| 日韩成人免费电影| 欧美专区亚洲专区| 一区在线观看免费| 国产成人免费在线观看不卡| 欧美一区国产二区| 亚洲一级电影视频| av不卡免费在线观看| 国产午夜亚洲精品不卡| 欧美精品成人一区二区三区四区| 中文字幕一区二区三区精华液| 黄网站免费久久| 9191成人精品久久| 亚洲成人tv网| 欧美视频在线播放| 一区二区三区在线播| eeuss影院一区二区三区| 国产午夜精品一区二区三区视频| 欧美aⅴ一区二区三区视频| 欧美日韩综合不卡| 亚洲专区一二三| 91亚洲精华国产精华精华液| 中文字幕av一区二区三区| 国产美女一区二区三区| 26uuu亚洲| 国内精品久久久久影院色| 精品盗摄一区二区三区| 久久机这里只有精品| 日韩一区二区三区观看| 日韩经典中文字幕一区| 在线不卡中文字幕| 青青草国产精品亚洲专区无| 欧美一区二区在线视频| 日本一道高清亚洲日美韩| 91精品中文字幕一区二区三区| 午夜精品成人在线视频| 7777精品久久久大香线蕉 | 国产曰批免费观看久久久| 欧美一区二区在线视频| 麻豆91在线播放| 欧美一区二区三区啪啪| 秋霞影院一区二区| 欧美电影免费观看高清完整版| 免费观看久久久4p| 精品日韩在线观看| 国产精品456| 中文字幕成人在线观看| 99re这里都是精品| 亚洲欧美日韩人成在线播放| 中文字幕亚洲在| 91丝袜美腿高跟国产极品老师| 亚洲欧美自拍偷拍色图| 91成人免费网站| 午夜在线成人av| 日韩一级片在线播放| 国产制服丝袜一区| 亚洲欧美在线aaa| 91黄色免费网站| 日韩精品亚洲专区| 欧美大白屁股肥臀xxxxxx| 国产精品一区一区三区| 亚洲欧美综合网| 欧美色成人综合| 精品一区二区久久久| 久久精品日产第一区二区三区高清版 | 亚洲毛片av在线| 欧美系列日韩一区| 免费成人av在线播放| 国产日韩欧美一区二区三区乱码 | 欧美日韩精品电影| 日韩经典一区二区| 久久久久亚洲综合| 97久久超碰精品国产| 亚洲成av人**亚洲成av**| 欧美va在线播放| 成人不卡免费av| 亚洲成人动漫av| 久久精品人人爽人人爽| 97精品超碰一区二区三区| 午夜精品福利视频网站| 国产丝袜美腿一区二区三区| 一区二区三区加勒比av| 日韩免费高清电影| 99re66热这里只有精品3直播| 婷婷综合久久一区二区三区| 国产欧美一区二区在线| 欧美午夜免费电影| 高潮精品一区videoshd| 亚洲国产成人精品视频| 久久青草欧美一区二区三区| 在线精品视频一区二区三四| 精品一区二区三区免费毛片爱| 亚洲精选视频在线| 欧美精品一区二区三| 欧美伊人久久大香线蕉综合69| 国产麻豆成人传媒免费观看| 亚洲福利一区二区三区| 中日韩av电影| 欧美精选午夜久久久乱码6080| 福利一区二区在线观看| 青青草成人在线观看| 亚洲另类一区二区| 国产午夜亚洲精品不卡| 欧美一级在线观看| 色视频成人在线观看免| 精品一二三四在线| 亚洲成人777| 亚洲色图视频免费播放| 久久亚洲精精品中文字幕早川悠里| 欧美日韩一区在线| www.色精品| 精品国产污污免费网站入口| 欧美日韩国产高清一区二区三区 | 国产三级久久久| 欧美日韩免费观看一区二区三区| 成人午夜视频免费看| 久久精品噜噜噜成人av农村| 亚洲一区影音先锋| 亚洲欧洲av色图| 久久噜噜亚洲综合| 精品少妇一区二区三区免费观看| 欧美色综合网站| 色婷婷综合久久久中文一区二区| 国产成人免费在线观看不卡| 九色综合狠狠综合久久| 三级欧美在线一区| 亚洲国产你懂的| 又紧又大又爽精品一区二区| 国产精品对白交换视频| 日本一区二区三区四区在线视频| 日韩欧美国产一区二区在线播放| 欧美高清激情brazzers| 欧美色区777第一页| 在线亚洲高清视频| 色婷婷综合久久久久中文| 99国产精品一区| gogo大胆日本视频一区| 成人免费毛片高清视频| 大陆成人av片| 国产欧美一区二区精品秋霞影院| 欧美一区二区三区的| 欧美精品在线一区二区三区| 欧美精品久久久久久久多人混战 | 亚洲动漫第一页| 亚洲国产精品一区二区www| 一区二区免费在线| 亚洲午夜三级在线| 亚洲成av人片一区二区梦乃| 午夜a成v人精品| 日韩国产欧美在线观看| 爽好多水快深点欧美视频| 日韩电影网1区2区| 蜜臀99久久精品久久久久久软件| 奇米888四色在线精品| 精品一二线国产| 国产一区二区中文字幕| 成人免费看视频| 色综合一区二区| 欧美日韩在线亚洲一区蜜芽| 69堂国产成人免费视频| 精品国产一区二区在线观看|