歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C++ 數組和指針學習筆記

C++ 數組和指針學習筆記

日期:2017/3/1 9:41:52   编辑:Linux編程

數組

定義及其初始化

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個章節中:

  1. Linux-C成長之路(一):Linux下C編程概要 http://www.linuxidc.com/Linux/2014-05/101242.htm
  2. Linux-C成長之路(二):基本數據類型 http://www.linuxidc.com/Linux/2014-05/101242p2.htm
  3. Linux-C成長之路(三):基本IO函數操作 http://www.linuxidc.com/Linux/2014-05/101242p3.htm
  4. Linux-C成長之路(四):運算符 http://www.linuxidc.com/Linux/2014-05/101242p4.htm
  5. Linux-C成長之路(五):控制流 http://www.linuxidc.com/Linux/2014-05/101242p5.htm
  6. Linux-C成長之路(六):函數要義 http://www.linuxidc.com/Linux/2014-05/101242p6.htm
  7. Linux-C成長之路(七):數組與指針 http://www.linuxidc.com/Linux/2014-05/101242p7.htm
  8. Linux-C成長之路(八):存儲類,動態內存 http://www.linuxidc.com/Linux/2014-05/101242p8.htm
  9. Linux-C成長之路(九):復合數據類型 http://www.linuxidc.com/Linux/2014-05/101242p9.htm
  10. Linux-C成長之路(十):其他高級議題

 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

Copyright © Linux教程網 All Rights Reserved