數組
定義及其初始化
1、數組的維數必須用值大於等於1的常量表達式定義(包括:整型字面值常量、枚舉常量、用常量表達式初始化的整型const對象),非const變量以及到運行階段才知道其值的const變量都不能用於定義數組的維數。
3、定義數組時沒有顯式的初始化,則:
----在函數體外定義的內置數組,元素均初始化為0
----在函數體內定義的內置數組,元素均無初始化
----無論在何處定義,若其元素為類類型,則自動調用其默認的構造函數初始化;若無構造函數,則必須為該數組的元素提供顯式的初始化
2、字符數組可以使用字符串字面值進行初始化,但當使用字符串字面值來初始化字符數組時,將在數組後面加入空字符,例如:char A[] = "C++"; //A的維數是4
3、與vector不同,一個數組不能用另一個數組初始化,也不能將一個數組賦值給另一個數組
注意:數組長度固定,一旦定義,就無法添加新的元素。但是若要添加,則需要自己更改內存remalloc()以及malloc()函數可以實現
數組的操作
下標訪問。下標的數據類型:size_t
指針
定義及其初始化
建議:盡量避免使用指針和數組
指針和數組容易產生不可預料的錯誤。其中一部分是概念上的問題:指針用於低級操作,容易然生與繁瑣細節相關的(book keeping)錯誤。其他錯誤則源於使用指針的語法規則,特別是聲明指針的語法。
許多有用的程序都可不使用數組或指針實現,現代C++程序采用vector類型和迭代器取代一般的數組、采用string類型取代C風格字符串。
指針可能的取值
一個有效的指針必然是以下三種狀態之一:保存一個特定對象的地址;指向某個對象後面的另一對象;或者是0值。若指針保存0值,表明它不指向任何對象。未初始化的指針是無效的,直到給該指針賦值後,才可使用它。
C++ Primer Plus 第6版 中文版 清晰有書簽PDF+源代碼 http://www.linuxidc.com/Linux/2014-05/101227.htm
讀C++ Primer 之構造函數陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm
讀C++ Primer 之智能指針 http://www.linuxidc.com/Linux/2011-08/40177.htm
讀C++ Primer 之句柄類 http://www.linuxidc.com/Linux/2011-08/40175.htm
將C語言梳理一下,分布在以下10個章節中:
int ival = 1024;
int *pi = 0; // pi initialized to address no object
int *pi2 = & ival; // pi2 initialized to address of ival
int *pi3; // ok, but dangerous, pi3 is uninitialized
pi = pi2; // pi and pi2 address the same object, e.g. ival
pi2 = 0; // pi2 now addresses no object
指針初始化和賦值操作的約束
對指針進行初始化或賦值只能使用以下四種類型的值:
(1)0值常量表達式。
(2)類型匹配的對象的地址。
(3)另一對象之後的下一地址。
(4)同類型的另一個有效指針。
把int型變量賦給指針是非法的,盡管此int型變量的值可能為0。
void*指針
C++提供了一種特殊的指針類型void*,它可以保存任何類型對象的地址:
double obj = 3.14;
double *pd = &obj;
// ok: void* can hold the address value of any data pointer type
void *pv = &obj; // obj can be an object of any type
pv = pd; // pd can be a pointer to any type
----void*表明該指針與一地址值相關,但不清楚存儲在此地址上的對象的類型。
----void*指針只支持幾種有限的操作:與另一個指針進行比較;向函數傳遞void*指針或從函數返回void*指針;給另一個void*指針復制。
----不允許用void*指針操縱它所指向的對象。
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-07/104618p2.htm