標籤:c++ 學習筆記
一 Reference 和指標的區別
雖然使用引用(reference)和指標都可間接訪問另一個值,但它們之間有兩個重要區別。第一個區別在於引用總是指向某個對象:定義引用時沒有初始化是錯誤的。第二個重要區別則是賦值行為的差異:給引用賦值修改的是該引用所關聯的對象的值,而並不是使引用與另一個對象關聯。引用一經初始化,就始終指向同一個特定對象(這就是為什麼引用必須在定義時初始化的原因)。 考慮以下兩個程式段。第一個程式段將一個指標賦給另一指標:
int ival = 1024, ival2 = 2048; int *pi = &ival, *pi2 = &ival2; pi = pi2; // pi now points to ival2
賦值結束後,pi 所指向的 ival 對象值保持不變,賦值操作修改了 pi 指標的值,使其指向另一個不同的對象。現在考慮另一段相似的程式,使用兩個引用賦值:
int &ri = ival, &ri2 = ival2; ri = ri2; // assigns ival2 to ival
這個賦值操作修改了 ri 引用的值 ival 對象,而並非引用本身。賦值後,這兩個引用還是分別指向原來關聯的對象,此時這兩個對象的值相等。
二
int *ip[4]; // array of pointers to intint (*ip)[4]; // pointer to an array of 4 ints
三 typedef 簡化指向多維陣列的指標
typedef 類型定義可使指向多維陣列元素的指標更容易讀、寫和理解。以下程式用 typedef 為 ia 的元素類型定義新的類型名:
int ia[3][4]; // array of size 3, each element is an array of ints of size 4 int (*ip)[4] = ia; // ip points to an array of 4 ints ip = &ia[2]; // ia[2] is an array of 4 intstypedef int int_array[4]; int_array *ip = ia;
可使用 typedef 類型輸出 ia 的元素:
for (int_array *p = ia; p != ia + 3; ++p) for (int *q = *p; q != *p + 4; ++q) cout << *q << endl;
外層的 for 迴圈首先初始化 p 指向 ia 的第一個內部數組,然後一直迴圈到 ia 的三行資料都處理完為止。++p 使 p 加 1,等效於移動指標使其指向 ia 的下一行(例如:下一個元素)。