一攒岛、數(shù)組
C++數(shù)組從0開始編號(hào)舆绎。
數(shù)組不可以相互賦值。
在C++11中 初始化數(shù)組可以忽略等號(hào)秸歧,其次如果再大括號(hào)中不填入任何東西厨姚,這將吧所有元素設(shè)為0,同時(shí)列表初始化禁止縮窄轉(zhuǎn)換键菱。
二谬墙、字符串
字符串賦值...
拼接字符串常量
拼接字符串時(shí)前一個(gè)字符串的\0被下一個(gè)字符串第一個(gè)字符替代。
strlen()只計(jì)算可見的字符,而不把空字符計(jì)算在內(nèi)拭抬。
cin使用空白(空格部默、制表符和換行符)來確定字符串的結(jié)束位置,這意味著cin在獲取字符數(shù)組輸入時(shí)之讀取一個(gè)單詞造虎。讀取該單詞后傅蹂,cin將該字符串放到數(shù)組中,并自動(dòng)在結(jié)尾添加空字符累奈。
每次讀取一行字符串輸入
面向行的輸入:getline()
getline()函數(shù)讀取整行贬派,它通過回車鍵輸入的換行符來確定輸入結(jié)尾。要調(diào)用這種方法澎媒,可以使用cin.getline()搞乏。該函數(shù)有兩個(gè)參數(shù)。第一個(gè)參數(shù)是用來儲(chǔ)存輸入行的數(shù)組的名稱戒努,第二個(gè)參數(shù)是讀取字符數(shù)(包括了\0)请敦。getline()成員函數(shù)在讀取指定數(shù)目的字符或遇到換行符時(shí)停止讀取并舍棄換行符。如果第一個(gè)字符是換行符储玫,將會(huì)將一個(gè)空字符串賦給數(shù)組侍筛。
面向行的輸入:get()
cin.get()用于讀取下一個(gè)輸入的字符。
cin.get(name,size)遇到換行符不再讀取并將其留在輸入序列中撒穷。
另一種方法是醬兩個(gè)類成員函數(shù)拼接起來 cin.get(name,size).get()
之所以可以這樣做匣椰,是由于cin.get(name,size)返回一個(gè)cin對(duì)象,該對(duì)象隨后將被用來調(diào)用get()函數(shù)端礼。
同樣 cin.getline(name,size).getline(name,size);禽笑。也可。
當(dāng)讀取空行時(shí) get()讀取空行后將設(shè)置失效位置蛤奥。這意味著加些來的輸入將被阻斷佳镜。可以用cin.clear()來恢復(fù)輸入凡桥。
如果輸入行包括的字符數(shù)比指定的多則getline()和get()將把余下的字符留在輸入隊(duì)列中蟀伸,而getline()還會(huì)設(shè)置失效位,并關(guān)閉后面的輸入缅刽。
混合輸入字符串和數(shù)字
string類簡(jiǎn)介
頭文件string #include<string>
string str1,str2;
可以使用c風(fēng)格字符串來初始換string對(duì)象啊掏。可以使用cin來將鍵盤輸入儲(chǔ)存到string對(duì)象中衰猛。
可以使用cout來顯示string對(duì)象脖律。可以使用數(shù)組表書法方位儲(chǔ)存在string對(duì)象中的字符腕侄。
str1=str2; //把2復(fù)制給1小泉。 str1+=“xxx”//在str1后增添xxx芦疏。
string類具有自動(dòng)調(diào)整大小的功能。
確定字符串字符數(shù) int len1=str1.size(); //int len2=strlen(str2);
c函數(shù)使用參數(shù)來指出要使用哪個(gè)字符串微姊,而C++ string類對(duì)象使用對(duì)象名和據(jù)點(diǎn)運(yùn)算符來指出要使用哪個(gè)字符串酸茴。
使用getline讀取string類 getline(cin,str);
C++結(jié)構(gòu) C++允許在聲明結(jié)構(gòu)變量時(shí)省略關(guān)鍵字struct
與數(shù)組一樣,C++11也至此將列表初始化用于結(jié)構(gòu)兢交,且等號(hào)是可選的薪捍。
一定要讓結(jié)構(gòu)定義能夠訪問名稱空間std。
結(jié)構(gòu)體中的位字段
共用體
共用體是一種數(shù)據(jù)格式配喳,它能夠儲(chǔ)存不同的數(shù)據(jù)類型酪穿,但只能同時(shí)儲(chǔ)存其中一種類型,共用體長(zhǎng)度為最大成員長(zhǎng)度晴裹。
匿名共用體沒有名稱被济,其成員將成為位于相同地址處的變量,顯然涧团,每次只有一個(gè)成員是當(dāng)前的成員只磷。共用體常用于節(jié)省內(nèi)存。
枚舉...
指針和自由儲(chǔ)存空間
指針定義方面略 詳見后文泌绣。
指針的危險(xiǎn)
在C++中創(chuàng)建指針時(shí)钮追,計(jì)算機(jī)將分配用來儲(chǔ)存地址的內(nèi)存,但不會(huì)分配用來儲(chǔ)存指針?biāo)赶虻膬?nèi)存阿迈。
一定要在對(duì)指針應(yīng)用解除引用運(yùn)算符*之前元媚,講指針初始化為一個(gè)確定的適當(dāng)?shù)牡刂贰?/p>
用new來分配內(nèi)存。
在C語言苗沧,可以用庫(kù)函數(shù)malloc()來分配內(nèi)存刊棕;在C++中仍然可以這樣做,但C++還有更好的方法———new運(yùn)算符崎页。
程序員要告訴new需要為哪種數(shù)據(jù)類型分配內(nèi)存鞠绰;new將找到一個(gè)長(zhǎng)度正確的內(nèi)存塊腰埂,并返回該內(nèi)存塊的地址飒焦。程序員的責(zé)任是將該地址賦給一個(gè)指針。 例如 int * pn=new int;(相比malloc方便很多)
對(duì)于指針屿笼,需要指出的另一點(diǎn)是牺荠,new分配的內(nèi)存塊通常與常規(guī)變量聲明分配的內(nèi)存塊不同。變量nights和pd的值都儲(chǔ)存在中被稱為棧的內(nèi)存區(qū)域中驴一,而new從被稱為堆的自由儲(chǔ)存區(qū)的內(nèi)存區(qū)域分配內(nèi)存休雌。
內(nèi)存被耗盡new將會(huì)返回空指針。
使用delete釋放內(nèi)存
例如delete p;(類比C語言中的free)
delete會(huì)釋放指針?biāo)赶虻膬?nèi)存肝断,但不會(huì)刪除指針本身杈曲,也就是說指針可以重新指向另一個(gè)內(nèi)存塊驰凛。
注意:只能用delete來釋放使用new分配的內(nèi)存。然而担扑,對(duì)空指針使用delete是安全的恰响。
使用new來創(chuàng)建動(dòng)態(tài)數(shù)組。
int * psome= new int [10];
delete [] psome;
方括號(hào)告訴程序應(yīng)該釋放整個(gè)數(shù)組涌献,而不僅僅是指針指向的元素胚宦。
總之 1.不要使用delete釋放不是new分配的內(nèi)存。
? ? ? ? 2.不要使用delete釋放同一個(gè)內(nèi)存塊兩次燕垃。
? ? ? ? 3.如果使用 new []為數(shù)組分配內(nèi)存枢劝,則應(yīng)使用delete[]來釋放。
? ? ? ? 4.如果使用new為一個(gè)實(shí)體分配內(nèi)存卜壕,則應(yīng)使用delete來釋放您旁。
? ? ? ? 5.對(duì)空指針應(yīng)用delete是安全的。
使用動(dòng)態(tài)數(shù)組印叁”幻埃可以直接使用psome[0]...psome=psome+1可以指向數(shù)組中下一個(gè)元素的地址。在使用delete釋放動(dòng)態(tài)數(shù)組時(shí)指針應(yīng)該指向原來的值轮蜕,這樣可以給delete[]提供正確的地址昨悼。所以說 p[i]=*(p+i);注意的是數(shù)組名是不允許進(jìn)行加一處理的。
指針跃洛、數(shù)組和指針?biāo)阈g(shù)率触。
同C一樣C++將數(shù)組名解釋為地址。指針加一會(huì)增加它所指向類型的字節(jié)數(shù)汇竭。
在多數(shù)情況下C++將數(shù)組名解釋為數(shù)組第一個(gè)元素的地址葱蝗。所以可以在指針初始化時(shí)讓他等于數(shù)組名。
數(shù)組和指針第一個(gè)區(qū)別是可以修改指針的值细燎,而數(shù)組名是常量两曼。另一個(gè)區(qū)別是對(duì)數(shù)組應(yīng)用sizeof運(yùn)算符得到的是數(shù)組的長(zhǎng)度,而對(duì)指針應(yīng)用sizeof得到的是指針的長(zhǎng)度玻驻。
對(duì)數(shù)組取地址(暫略 個(gè)人認(rèn)為應(yīng)該在二維數(shù)組等方面會(huì)詳細(xì)涉及 詳細(xì)將放在文尾)
使用數(shù)組聲明來創(chuàng)建數(shù)組時(shí)悼凑,將采用靜態(tài)聯(lián)編,即數(shù)組的長(zhǎng)度在編譯時(shí)設(shè)置璧瞬。
使用new[]運(yùn)算符創(chuàng)建數(shù)組時(shí)户辫,將采用動(dòng)態(tài)聯(lián)編(動(dòng)態(tài)數(shù)組)(ps.這里是可以做變長(zhǎng)數(shù)組的),即將在運(yùn)行時(shí)位數(shù)組分配空間嗤锉,其長(zhǎng)度也將在運(yùn)行時(shí)設(shè)置渔欢。使用完這種數(shù)組后,應(yīng)使用delete[]釋放其占用的內(nèi)存瘟忱。
數(shù)組和指針的特殊關(guān)系可以款占到C-風(fēng)格字符串奥额。
在C++中苫幢,用引號(hào)括起的字符串像數(shù)組名一樣,也是第一個(gè)元素的地址垫挨。代碼不會(huì)將整個(gè)字符串發(fā)送給cout态坦,傳遞的是他們的地址。
在cout和多數(shù)C++表達(dá)式中棒拂,char數(shù)組名伞梯、char指針一級(jí)用引號(hào)括起的字符串常量都被解釋為字符串的第一個(gè)字符的地址。
在將字符串讀入程序是應(yīng)使用已分配的內(nèi)存地址帚屉。該地址可以使數(shù)組名谜诫,也可以是使用new初始化過的指針。
在用cout輸出字符串時(shí)如果前面加上(int *)則會(huì)輸出他的地址攻旦。
使用new創(chuàng)建動(dòng)態(tài)結(jié)構(gòu)
struct things{
int good;
int bad;
};
things grubnose={10,20};//grubnose是一個(gè)結(jié)構(gòu) 他含有兩個(gè)變量并進(jìn)行了初始化喻旷。
things *p=&grubnose; pt指向結(jié)構(gòu)grubnose。
引用方面 p->good等價(jià)于grubnose.good也等價(jià)于(*p).good牢屋。
自動(dòng)儲(chǔ)存且预、靜態(tài)儲(chǔ)存和動(dòng)態(tài)儲(chǔ)存。(C++新增了第四種類型———線程儲(chǔ)存)
1.自動(dòng)存儲(chǔ)烙无。
在函數(shù)內(nèi)部定義的常規(guī)變量使用自動(dòng)儲(chǔ)存空間锋谐,被稱為自動(dòng)變量,這以為著他們?cè)谒鶎俸瘮?shù)被調(diào)用時(shí)自動(dòng)產(chǎn)生截酷,在函數(shù)結(jié)束時(shí)消失涮拗。
實(shí)際上,自動(dòng)變量是一個(gè)局部變量迂苛,其作用域?yàn)榘拇a塊三热。自動(dòng)變量通常儲(chǔ)存在棧中。這意味著執(zhí)行代碼塊是三幻,其中的變量將依次加入到棧中就漾,而離開代碼塊時(shí)將按相反的順序釋放這些變量,這被稱為先進(jìn)后出念搬。因此抑堡,在程序執(zhí)行過程中,棧將不斷地增大和縮小锁蠕。
2.靜態(tài)存儲(chǔ)夷野。
靜態(tài)存儲(chǔ)是整個(gè)程序執(zhí)行期間都存在的儲(chǔ)存方式懊蒸。使變量成為靜態(tài)的方式有兩種:一種是在函數(shù)外面定義它荣倾;另一種是在聲明變量時(shí)使用關(guān)鍵字static。
3.動(dòng)態(tài)存儲(chǔ)骑丸。
new和delete運(yùn)算符提供了一種比自動(dòng)變量和靜態(tài)變量更靈活的方法舌仍。他們管理了一個(gè)內(nèi)存池妒貌,這在C++中被稱為自動(dòng)存儲(chǔ)空間或堆。該內(nèi)存池同用于靜態(tài)變量和自動(dòng)變量的內(nèi)存是分開的铸豁。new和delete可以在一個(gè)函數(shù)中分配內(nèi)存灌曙,而在另一個(gè)函數(shù)中釋放它。
內(nèi)存泄漏...
類型組合...
數(shù)組的替代品
1.模板類vector
模板類vector類似于string類节芥,也是一種動(dòng)態(tài)數(shù)組在刺。您可以在運(yùn)行階段設(shè)置vector對(duì)象的長(zhǎng)度,可在末尾附加新數(shù)據(jù)头镊,還可在中間插入新數(shù)據(jù)蚣驼。基本上相艇,他是使用new創(chuàng)建動(dòng)態(tài)數(shù)組的替代品颖杏。實(shí)際上,vector確實(shí)使用new和delete來管理內(nèi)存坛芽,但這種工作是自動(dòng)完成的留储。
頭文件要包含#include<vector>
vector<typename> vt(n_elem); //typename是類型 vt為數(shù)組名 n_elem為長(zhǎng)度 可以不帶(n_elem)默認(rèn)為0。其中n_elem可以是整型常量也可以是整型變量咙轩。
2.模板類array
array長(zhǎng)度固定获讳,也使用棧。
array<typename,n_elem> arr活喊。
不同的是 n_elem不能是變量赔嚎。
在C++11中,可將列表初始化用于vector和array對(duì)象胧弛,但在C++98中尤误,不能對(duì)vector對(duì)象這樣做。
注意 double a1[3];
a1[-2]等價(jià)于*(a1-2)出現(xiàn)越界
vector和array同樣结缚。
一種解決方法是使用成員函數(shù)at()损晤。 例如a2.at(1)=2.3。使用at()時(shí)將在運(yùn)行期間捕獲非法索引红竭,而程序默認(rèn)將中斷尤勋。
(完)
很明顯這章相比于前三章長(zhǎng)了很多(正好3k字) 但是 相對(duì)來看 如果有一定編程基礎(chǔ)的話本章其實(shí)應(yīng)該較容易去理解 。
附上菜鳥教程茵宪。
http://www.runoob.com/cplusplus/cpp-variable-scope.html
http://www.runoob.com/cplusplus/cpp-pointers.html
http://www.runoob.com/cplusplus/cpp-arrays.html
http://www.runoob.com/cplusplus/cpp-array-of-pointers.html
http://www.runoob.com/cplusplus/cpp-pointers-vs-arrays.html
http://www.runoob.com/cplusplus/cpp-pointer-to-pointer.html