四章 札記 C primer 之旅

2021-06-07 18:36:05 字數 3047 閱讀 2156

陣列的型別 不能是引用。即不存在引用的陣列。

陣列: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 中可以這樣簡單的理解左值和右值 能夠取位址的 有名字的就是左值,反之,不能取位址的 沒有名字的就是右值。當乙個物件被用作右值的時候,用的是物件的值 內容 當物件被用作左值的時候,用的是物件的身份 在記憶體中的位置 乙個重要的原則是在需要右值的地方可以用左值來代替,但是不能把右值當...