陣列的型別 不能是引用。即不存在引用的陣列。
陣列:char s="c++"; 等價於 char s2=;
陣列下標的正確型別是 size_t;
指標:
理解指標宣告語句時,從右往左閱讀。
ex :string *pstring ; 把 pstring 定義為 指向string 的指標。
有效的指標 的三種狀態:
1)乙個特定物件的位址 ex: int ival; int *pint=&ival;
2)某個物件後面的另一物件
3)0值,不指向任何物件 ex: int *pint=0; 數值0 或 編譯時可獲得0值的const 變數 ex : const int c_ival=0; int *pi=c_ival;
或者是 cstdlib 標頭檔案定義的預處理變數null. int *pi=null;
未初始化的指標是無效的,dangerous的。
特殊的指標型別 void * 可以儲存任何型別物件的位址。
指向指標的指標:
ex: int ival=1024;
int *pi=&ival;
int **pi=π
指標 和 陣列
注: 表示式中使用陣列名時,自動轉換為指向陣列第乙個元素的指標。
指標的算術操作:
int ia[10];
int *ip=ia; // ip points to ia[0];
int *ip2=ip+4; //ip2 points to ia[4];
指標間隔: ip2-ip 結果4 型別是 ptrdiff_t (標準庫型別)
指標和下標:
int ia=;
int *p=&ia[2];
int j=p[1] ; // p[1] = *(p+1); p[1] = ia[3];
int k=p[-2]; // p[-2]=*(p-2); p[-2]=ia[0];
陣列的超出末端指標,相當於 vector.end() ; 常用作哨兵。
ex:
const size_t arr_size=5;
int arr[arr_size];
int *p=arr;
int *p2=p+arr_size;
注:允許計算陣列或物件的超出末端的位址,但不可以對此位址進行解引用操作。
指標和 const
1、 指向const物件的 指標。
tip: 指向const的指標 自以為指向const 的指標。
ex: const double *cptr; 或 double const *cptr;
不能把乙個void * 儲存const 物件的位址。必須使用 const void *
允許把非const 物件的位址 賦給指向const物件的指標。此時則不能通過該指標修改該變數的值
2、const 指標
指標本身的值不能修改
ex: int ival=5;
int *const ptr=&ival;
3、指向const 物件的const 指標
以上1、2 的並集吧
4、指標 和 typedef
typedef string *pstring;
const pstring cstr;
pstring const cstr;
解析: pstring 是 指向string 的指標,而const 修飾的是pstring ,所以 cstr 為指向string 的const指標。定義等價於 string *string cstr;
注意: 字串字面值的型別就是const char的陣列。
ex: const char *cp1 = "a string example";
陣列型別的三個重要的限制:
1) 陣列長度固定不變
2)編譯時必須知道其長度
3)陣列只在定義它的塊語句內存在
動態陣列: 執行時才確定陣列長度, 動態陣列將一直存在,直到程式顯示釋放它。
動態陣列存放在程式的自由儲存區或堆的操作:
c 庫函式 malloc 和 free
c++ new 和 delete
初始化: 1)類型別: 預設建構函式;2) 內建型別,無
可以通過 int *pia = new int[10](); // 元素設定為0,比如const物件的動態陣列。
注意: c++ 不允許定義長度為0的陣列變數,呼叫new動態可以建立長度為0的陣列是合法的。
動態空間的釋放: delete 釋放指標所指向的陣列空間 注意: 告訴指標指向的是陣列。必不可少,否則會記憶體洩露
string.c_str() ; 返回c風格字串。 返回型別是 const char *
陣列初始化vector 物件:
vectorivec(int_arr,int_arr+arr_size); 引數: 陣列的第乙個元素和最後乙個元素的下乙個位置的位址
定義指向陣列的指標: 宣告元素型別、陣列變數名字和維數;
ex:int ia[3][4];
int (*ip)[4]=ia; // ip 指向 長度為4的int陣列
ip=ia[2]; // ia[2] 就是長度為4的int陣列
int (*ip) [4] 從內向外理解: *ip 是 int[4] 型別 -- 即ip 是指向含有4個元素的陣列的指標。
辨析:
int *ip[4]; // 整型指標的陣列,長度為4
int (*ip) [4];
用 typedef 簡化指向多維陣列的指標。
typedef int int_array[4];
int_array *ip = ia ; 等價於上面的定義
十章 札記 C primer 之旅
兩個基本的關聯容器 map 關聯陣列,元素通過鍵來儲存和讀取 set 集合,multimap 同乙個鍵可多次出現的map multiset 同乙個鍵可多次出現的set pair型別 標頭檔案 utility map 型別 標頭檔案 map 建構函式 mapm mapm m2 建立m2的副本 mapm...
C PRIMER第四章練習
4.1 先乘除後加減,105 4.2a vec.begin b vec.begin 1 4.3可以接受,可以提高編譯器效率,潛在缺陷只要注意不讓表示式指向並修改同一物件就可以忽略 4.4 12 3 4 5 15 24 4 2 91 4.5a 86 b 18 c 0d 2 4.6if ival 2 為...
C Primer 學習(第四章)
1.左值和右值 c 中可以這樣簡單的理解左值和右值 能夠取位址的 有名字的就是左值,反之,不能取位址的 沒有名字的就是右值。當乙個物件被用作右值的時候,用的是物件的值 內容 當物件被用作左值的時候,用的是物件的身份 在記憶體中的位置 乙個重要的原則是在需要右值的地方可以用左值來代替,但是不能把右值當...