沒有任何對象會被分配到地址0。因此,0被當做一個指標文字量,表明一個指標當時並沒有指向任何對象。在C中流行的是用一個宏NULL表示0指標。由於C++收緊的類型檢查規則,採用普通的0而不是一些人建議的NULL宏,帶來的問題會更少一些。
數組元素的個數,即數組的界,必須是一個常量運算式。如果需要變化的界,那麼可以用vector。例如:
void f(int i)
{
int v1[i]; //錯誤,數組大小必須是常量運算式
vector<int> v2(i); //可以
}
逗號是序列運算子,不允許出現在常量運算式裡。例如:
int bad[5,2]; //錯誤,逗號不允許出項在常量運算式裡
如果明確給出了大小,數組在初始化列表中給了多餘的元素就是錯誤。例如:
char v3[2] = {'a', 'b', 0}; //錯誤,初始式太多
char v4[3] = {'a', 'b', 0}; //可以
如果初始式列表裡的元素太少,剩餘的元素將被設定為0。例如:
int v5[8] = {1, 2, 3, 4};
等價於
int v5[8] = {1, 2, 3, 4, 0, 0, 0, 0};
char p[] = "abc""def";等價於char p[] = "abcdef";
int v[] = {1, 2, 3, 4};
int * p3 = &v[4]; //指向最後元素之後一個位置
取得超出一個數組結束之後一個元素位置的指標,這件事將保證可以做到。當然,這個指標事實上並不指向數組裡的一個元素,因此不能通過它去讀或者寫
常量必須初始化。例如:
const int model = 90; //model是個常量
const int x; //錯誤,沒有初始化
int my_f(int);
const int c3 = my_f(3); //可行,編譯器不知道c3的值
int a = 3;
const int* p = &a; //可以
*p = 10; //錯誤,*p為const int
int& n = 2 //錯誤,要求左值
const int& n = 2; //可以
void指標不能直接運算。例如:
int* p;
void* pv = p; //可以
*pv; //錯誤
pv++ //錯誤