陣列的定義和初始化
注意:1.顯示初始化陣列元素
在函式體外定義的內建陣列,其元素均初始化為0;
在函式體內定義的內建陣列,其元素無初始化;
不管陣列在**定義,如果其元素為類型別,則自動呼叫該類的預設建構函式進行初始化,如果該類沒有預設建構函式,則必須為該陣列的元素提供顯式的初始化。
2.特殊的字元陣列
字元陣列在特殊的字面值的情況下,預設在陣列最後一位加null
char ca4=
"c++"
; c++後跟null
3.不允許陣列直接複製和賦值
注意:
與vector不同,陣列不提供push_back或者其他的操作在陣列中新增新元素,陣列一經定義,就不允許再新增新元素。
如果必須在陣列新增新元素,就必須自己管理記憶體:要求系統重新分配乙個新的記憶體空間用於存放更大的陣列,然後把原陣列的所有元素複製到新分配的記憶體空間去
4.1 陣列操作
陣列下標的正確型別則是size_t
4.2 指標的引入
4.2.1 什麼是指標
指標的概念很簡單:指標用於指向物件。
4.2.2 指標的定義和初始化
string *p2;
另外一種宣告指標的風格
string* p2;
c++繼承了c語言中的null ,# cstdlib null to 0
void*指標4.3指標操作
4.3.2指標和引用的區別
int val =
1024
,int val2=
2048
;int
*p1=
&val,
*p2=
&val2;
p1 = p2;
// 指標p1 指向p2
引用
int
&ri = val;
&ri2=val2;
ri = ri2;
// ri記憶體中的值替換成val2;但是ri ,ri2引用記憶體中的值和原來引用方向一致
4.3.3 指向指標的指標
int val =
1024
;int
*p =
&val;
int*
*ppi =
&p;
4.4 使用指標訪問陣列元素
c++語言中,指標和陣列關係密切,特別是在表示式中使用陣列名時,名字會自動轉換為指向陣列第乙個元素的指標:
2個指標減法操作的結果是標準庫型別ptrdiff_t的資料、這是signed整型。
4.4.1 解引用和指標算術操作之間的相互結果
int last =
*(ia +4)
;// last=ia[4];
int a =
*ia +4;
// a = ia[0] + 4;
由於加法和解引用操作的優先順序不同,圓括號是必須的。
4.5 指標和const 限定符
指向const 物件的指標和const指標
1.指向const 物件的指標
const
double pi =
3.134
;double
*ptr=
π// 編譯錯誤: ptr指標可能會改變pi的值,不符合const語義,所以編譯錯誤.
const
double
*cptr=
π//ok
不能使用void 指標儲存const物件的位址,而必須使用const void型別的指標儲存const物件的位址。
const
int un =43;
const
void
*cpv =
&un;
void
*pv=
&un;
// 編譯錯誤
2.const 指標
除了指向const物件的指標外,c++還提供了const指標------本身的值不能修改:
int errnum =0;
int*
const cur=
&errnum;
cur = curerr;
//任何給const指標賦值都是編譯錯誤的。
與任何const 量一樣,const指標必須在定義時初始化。
指標本身是const的事實並沒有說明是否能使用該指標修改它所指向的物件的值。指標所指向物件的值能否修改完全取決於該物件的型別。
3.指向const物件的const指標
const
double pi =
3.14
;rconst
double
*const pi_ptr =
π
既不能修改pi_ptr所指向的物件的值,也不允許修改該指標的指向。
4.指標和typedef
typedef string *pstring;
const pstring cstr;
cstr是什麼型別?錯誤的回答是:const pstring是一種指標,指向string型別的const物件,但這是錯誤的。
錯的原因是:在於將typedef當做文字拓展了。宣告const pstring時,const修飾的是pstring的型別,這是乙個指標,因此,宣告語句應該是把cstr定義為指向的string型別物件的const指標,這個定義等價為:
string *const cstr;
建議:
閱讀const宣告語句時容易出現錯誤,源於const限定符既可以放在型別前面也可以放在型別後:
string const s1;
const string s2;
typedef 寫const型別定義時,const限定符加在型別前面容易引起對所定義的真正型別的誤解:
string s;
typedef string *pstring;
const pstring cstr1=
&s;pstring const cstr2 =
&s;string *
const cstr3=
&s;cstr1 ,2,
3都是一樣的意思。
4.6 c風格字串
字串字面值的型別就是 const char型別的陣列。
c風格字串就是以空字元null結束的字元陣列.
char ca1=
;char ca2=
;char ca3=
;const
char
*cp =
"c++"
;char
*cp1 = ca1;
char
*cp2 = ca2;
ca1 和cp1 都不是c風格,都不是以null結尾的。
處理c風格的標頭檔案在c語言:
#include 是string.h的c++版本,string.h是c語言提供的標準庫,
strlen
(s) 返回s的長度,不包括字串結束符null
strcmp
(s1,s2) 比較兩個字串s1和s2是否相同,若s1與s2相等,返回0,s1>s2,返回正數,s1strcat
(s1,s2) 將字串s2連線到s1後,並返回s1.
strcpy
(s1,s2) 將s2複製給s1,返回s1.
strncat
(s1,s2,n) 將s2的前n個字元連線到s1後面,返回s1.
strncpy
(s1,s2,n) 將s2的前n個字元複製到s1,返回s1.
4.6.1 永遠不要忘記字串結束符null
char ca=
;cout <<
strlen
(ca)
<< endl;
// 6 不正常
cout << ca / c++** 多輸出了東西
4.6.2 使用複製函式注意目標函式的空間是否足夠
4.6.3 主要使用string標準庫
4.7 建立動態陣列
c語言使用malloc和free 開闢和釋放記憶體
c++ 支援使用 new ,delete表示式使用
初始化:
string *pa =
new string[10]
;int
*pa =
newint[10
]();
strlen返回的是字串的長度,並不包括字串結束符,在獲得的字串長度必須加上1以便動態分配時預留結束符的儲存空間。
指標與多維陣列關係
第4章 陣列和指標 8
4.3.1 建立動態陣列 陣列型別的變數有三個重要的限制 陣列長度固定不變,在編譯時必須知道長度,陣列只在定義它的塊語句內存在。雖然陣列長度是固定的,但動態分配的陣列不必在編譯時知道其長度,可以 通常也是 在執行時才確定陣列長度。與陣列變數不同,動態分配的陣列將一直存在,直到程式顯式釋放它為止。每乙...
c primer 第4章 陣列和指標
避免使用未初始化的指標 對指標進行初始化或賦值只能使用以下四種型別的值 把int型變數賦給指標是非法的,儘管int型變數的值可能為0.但允許把數值0或在編譯時可獲得0值的const量賦給指標。3.void 指標 c 提供了一種特殊的指標型別void 它可以儲存任何型別物件的位址 void 指標只支援...
C Primer 第4版 第4章 陣列和指標
p95 設計良好的程式只有在強調速度時才在類實現的內部使用陣列和指標。p96陣列的維數必須用值大於等於1的常量表示式定義。此常量表示式只能包含整型字面值常量 列舉型別或者用常量表示式初始化的整型const物件。非const物件以及要到執行階段才知道其值的const變數都不能用於定義陣列的維數。p97...