char[]
- 數(shù)組申明必須是整形常值或const值,以及常量表達式如(8*sizeof(int))歹叮,即所有的值在編譯時都是已知的
- 數(shù)組允許列表初始化,并且允許對數(shù)組的部分元素初始化峡捡,其他元素將被設置為零
- 數(shù)組名是常指針
- c++11初始化數(shù)組時可省略等號永毅,可不包含任何東西的大括號,不可縮窄
- c++11在vector基礎上增加了array
- c風格的字符串需要在末尾加上'\0' ,否則不能當作字符串處理
- 字符串常量丧没,字符串字面值鹰椒,用引號括起來的字符串默認包含了空字符
- "S"是一個地址值,常量字符串的地址值
- sizeof包含空字符長度呕童,strlen不包含
- cin輸入通過鍵盤輸入的空格漆际,回車,制表符來識別字符串的結尾
- cin.getline(char[],int) 會自動清除回車夺饲,而cin.get()必須要用不帶參數(shù)的函數(shù)去清除
- 建議使用cin.get()奸汇,因為它更精細,使數(shù)組被填滿可以被檢查出來(通過讀取下一個元素看是否是回車)
- 空行讀取往声,get將設置失效位擂找,接下來的輸入將被阻斷。
- 輸入的行比分配的長時浩销,geiline會設置失效位贯涎,阻斷繼續(xù)輸入
- 輸入隊列的概念!
- 混合cin在讀取字符串時會將回車留在輸入隊列中撼嗓,而后調用getline會從輸入隊列中直接讀取回車停止后面的輸入柬采,解決辦法:get()或get(char)
string
- string對象必須聲明成 簡單變量而不是數(shù)組
- "轉義雙引號
- strlen(char[])
- cin>>str使用istream的成員函數(shù),getline()可行是因為使用了string的友元函數(shù)
- R標識原始字符句法:R”()“
結構
- 結構初始化滿足列表初始化的條件
- 結構中的位字段且警,整形和枚舉可以聲明成位字段粉捻,句法:unsigned int a :4;沒有名稱時是提供間距
union
- 定義成可以存儲多種類型斑芜,但是每一次只能存儲一種(多種類型之間是或的關系)肩刃,聲明方式和結構一樣,但是內存中只提供最長數(shù)據(jù)類型的大小的空間
枚舉
- 申明方式同結構enum,相當于多個const符號常值
- 只能將定義枚舉時的符號常量賦給枚舉變量盈包,而不是一般常值沸呐,它只定義了賦值運算符
- 枚舉量可以轉化為整形int,而反之不行(如對枚舉賦值時的轉型)
- 定義枚舉量時呢燥,可以對枚舉項顯示的賦值崭添,前面沒有復制的默認為0,后面的則在已賦值的基礎上逐步加一 叛氨,可以賦值多種整形類型呼渣!
- 可以對枚舉類型的變量初始化枚舉定義時范圍內的值,即枚舉自身會檢查范圍的邊界寞埠,并檢查新賦值的合法性
指針和c++基本原理
面向對象編程和傳統(tǒng)面向過程編程的區(qū)別在于屁置,OOP強調運行時決策。而后者因此更加靈活仁连。c++使用new關鍵字申請新的地址空間蓝角,并用指針來跟蹤這些內存。在這樣的新策略中饭冬,地址被視為制定的量使鹅,而值則變成派生量,指針變量用*表示間接值或者解除引用伍伤。
- 指針在聲明時并徘,只會分配給存儲地址的內存而不會給指向數(shù)據(jù)的內存遣钳,這就意味著在使用解除引用指針之前要確保指針指向一塊確切的空間扰魂,而不是野指針。
- 試圖將數(shù)字賦給指針變量時蕴茴,應當使用強制類型轉換劝评,使之類型匹配
- 指針的大小通常是四個字節(jié)和八個字節(jié)
- 指針可以被用來在運行時訪問未命名的內存,如常見的new就是用來分配這種的地址空間(動態(tài)內存 分配)倦淀,而這種運算符用于常規(guī)數(shù)據(jù)類型時蒋畜,我們也稱之為數(shù)據(jù)對象
- 必須聲明指針指向數(shù)據(jù)的類型的原因之一是,這樣指針可以根據(jù)數(shù)據(jù)首地址和數(shù)據(jù)類型對應的偏移量來訪問數(shù)據(jù)
- new出的空間在heap上撞叽,而常規(guī)變量在stack上姻成,而heap上的內存需要手動釋放,delete
- 空間分配失敗或者內存被釋放愿棋,指針值會被返回null(0)科展,此時建議使用delete null 進一步釋放
- 使用new和delete的原則:
- 不要使用delete來釋放不是new分配的內存
- 不要釋放同一個內存塊兩次
- 如果使用new[]和new來分別創(chuàng)建動態(tài)內存或者動態(tài)數(shù)組則需要用delete[] 和delete來釋放
- 對空指針使用delete是安全的
- 數(shù)組名實際上存的也是地址,只是這個地址是固定的糠雨,訪問數(shù)組元素是要給出確定單位數(shù)量的偏移量才睹,即使用下標訪問,而指指針則是變量,而指針算術的加法是加法是以數(shù)據(jù)類型的長度為單位
- 另外琅攘,對數(shù)組名使用取地址運算會得到的是一個以數(shù)組為類型的指針垮庐,這時候的指針加法的單位就是整個數(shù)組的長度,舉例:short (ptr)[20] = &tell坞琴,行指針的元素ptr<=>tell
- 指針可以同過解除引用來給內存寫入新 的值
- sizeof作用于數(shù)組名時是返回整個數(shù)組的長度哨查,所以我們可以假設數(shù)組名中包含了數(shù)組長度的信息
- cout字符串時,通過地址逐步訪問空間剧辐,直到遇到空地址為止
- 在cout和其他多數(shù)c++表達式中解恰,char數(shù)組名,char指針以及用引號括起來的字符串常量都被解釋為字符串第一個字符的地址
- 一般情況下給cout指針會輸出地址浙于,而對于char*則輸出字符串
- c++字符串字面值不能保證被唯一的存儲
- 對于字符數(shù)組在初始化時可以用字面常量來賦值护盈,而其他情況下用strcpy()或strncpy(),注意加cstring頭文件
- 動態(tài)結構創(chuàng)建時,應使用箭頭成員運算符而不是點成員運算符訪問成員羞酗,或者使用解除引用指針
- 一個很好的例子是使用動態(tài)數(shù)組來創(chuàng)建一個包含多個不一致長度的字符串數(shù)組腐宋,可以使用一個自定義的輸入函數(shù)來定義最大長度的局部變量(函數(shù)結束自動釋放),然后將從cin輸入的字符串有效長度賦值給動態(tài)字符數(shù)組(使用strcpy,記得加1)檀轨,然后記得在原函數(shù)里面使用delete釋放
自動存儲胸竞,靜態(tài)存儲,動態(tài)存儲(c++11增加了線程存儲)
- 自動存儲
函數(shù)內部定義的常規(guī)變量(如一般的局部變量)参萄,這些存儲空間(通常在棧上卫枝,遵循先進后出LIFO的釋放方式)在函數(shù)結束時自動釋放,所以返回指針變量時讹挎,記得不能將指針定義為該類型存儲方式校赤。避免訪問不存在的內存; - 靜態(tài)存儲
整個程序運行期間都存在的存儲方式筒溃,兩種方式創(chuàng)建靜態(tài)存儲變量
- 函數(shù)外的空間中
- static關鍵字修飾
- 動態(tài)存儲
關于動態(tài)存儲(一般表現(xiàn)為用new和delete搭配創(chuàng)建和釋放的空間)先介紹heap的概念马篮,區(qū)別于上面兩種方式,動態(tài)存儲可以動態(tài)控制變量的生命起始和終止怜奖,相應的堆內存的控制也更加復雜浑测,而stack更加線性。
- 由此引出了內存泄漏的異常歪玲,這主要是因為指向動態(tài)內存的指針不存在了迁央,但是內存空間沒有被釋放,變成了無法訪問的地址(主要是因為動態(tài)內存在heap上)滥崩,這樣的內存變成了泄露空間岖圈,即被占據(jù)而無法訪問,進而導致空間被耗盡夭委,造成溢出幅狮。
- vector是數(shù)組的替代品募强,他們使用new和delete動態(tài)管理內存
- array(c++11中)是靜態(tài)內存分配(棧上),所以聲明時要指定長度array<type,size>, 它的方便之處在于可以整體賦值崇摄,而數(shù)組(數(shù)組名為靜態(tài)地址)不行擎值,另外安全性上,array和vector可以自動檢查邊界逐抑,如begin()和end(),at()等函數(shù)的輔助鸠儿,我想array更像是使用了指針的靜態(tài)數(shù)組。