C primer 讀書筆記(3)

2021-06-21 22:03:08 字數 1571 閱讀 7464

指標

1. 指標類似於迭代器,有++操作和*操作。要注意的是,最好不要留下不初始化的指標,這樣很容易引起錯誤,而且很難發現,但是初始化為0的指標是可以被發現的,即不指向任何物件的空指標,所以如果指標暫時沒有要指向的物件,最好初始化為0,也可以用cstdlib庫里的null變數來初始化空指標,null不在std namespace裡,所以不需要用std::null,而是直接用null。

2. void* 指標可以指向任何型別的物件:

void *pv=&obj;   //obj可以是任何型別的物件

pv=pd; //pd可以是任何型別的指標

但是void*型別的指標可以進行的操作很有限:a)與另乙個指標比較;b)作為函式的引數或返回值;c)給另乙個void*型指標賦值。但是不能對void*指標所指物件進行操作。

3. pointer 和reference的區別主要有兩個:一是reference永遠是指向某個物件的,它其實只是乙個物件的別名,而指標可以為空;二是當對reference賦值時,改變的是它所指物件的值,而對pointer賦值時,改變的是pointer所指的物件,對物件本身沒有任何影響:

int ival=1024, ival2=2048;

int *pi=&ival, *pi2=&ival2;

pi=pi2; //pi指向了pi2,但是ival沒有變化

int &ri=ival, &ri2=ival2;

ri=ri2; //ri依舊指向ival,ival的值變成2048

4. 指標的指標,如int **ppi, 即指向int型指標的指標,要獲取該int變數的值,需要兩次dereference操作**ppi。

5. 對陣列使用下標實際上是在對指標使用下標,只要乙個指標指向陣列的某個元素,即可對其使用下標:

int *p=&a[2];

int j=p[1]; //j的值等於a[3]

int k=p[-2]; //k的值等於a[0]

6. 指標可以指向陣列的最後乙個元素的下乙個不存在的元素位置,就像iterator一樣,用於跟其他指標比較從而判斷是否遍歷完所有的元素,顯然它不能進行*(dereference)操作。

7.指向const變數的指標可以這樣定義:

const double *cptr;

const double pi=3.14;

double n=2.7;

cptr=π //ok:指向const變數

cptr=&n; //ok:也可以指向非const變數

*cptr=2.8; //error:無法通過這個指標改變非const變數的值,因為cptr始終認為它指向const變數

const型指標,可以理解為唯讀型指標,不能改變這個指標的值,定義如下:

int *const curerr=&errnumb;

C Primer讀書筆記(3)

vector 本科時學c 的時候沒學過vector,正好補一下。第乙個要注意的地方是要正確區分列表初始值還是元素數量。第二點是不能使用範圍for向vector物件新增元素,範圍for語句體內不應改變其所遍歷序列的大小。不能用下標形式給vector新增元素 迭代器 陣列的大小要定義為乙個常量。陣列的內...

C primer 讀書筆記

第2 章 變數和基本型別 1 變數直接初始化和變數 複製初始化 int ival 1024 direct initialization int ival 1024 copy initialization 初始化不是賦值 2 內建型別復 制初始化和直接初始化幾乎沒有區別 但 對類型別物件來 說,有些初...

C Primer讀書筆記

前些日子開始看 c primer 順便做一些筆記,既有書上的,也有自己理解的。因為剛學c 不久,筆下難免有謬誤之處,行文更是凌亂 所幸不是用來顯配的東西,發在linuxsir只是為了方便自己閱讀記憶,以防只顧上網忘了正事。書看了不到一半,所以大約才寫了一半,慢慢補充。const要注意的問題 1 下面...