C 指標和new相關

2022-05-18 01:22:10 字數 1806 閱讀 1592

看黃邦勇帥的筆記。

指標和new之前覺得已經掌握的很好了,可是看了資料還是get到了新知識。記錄一下。

1.指標只支援 4 種算術運算子:++,――,+,-.指標只能與整數加減.指標運算的原則是:每當指標的值增加時,它將指向其基本型別的下乙個元素的儲存單元.減少時則指向上乙個元素的儲存單元.

2.注意兩個指標不能相加. 例 int *p; p=&x; 假設 x 的位址為 200, 則 p+9 將的指標位址將是 200+4*9=236,即 p 指向了從當前正指向的元素向下的第 9 個元素.

3.兩指標相減,同型別的乙個指標減去另乙個指標的值將是兩個指標分開的基本型別的元素的個數.

4.const int x=1; int *p=&x;這樣做將發生錯誤,因為如果把 x 的位址給了 p,而指標 p 又修改了 x 的值時,這時 x 就違反了是常量的 規定,所以不允許這樣做。

5. int a[10];   則 a 等於 &a[0]

int b[3][4];  則b 等於 &b[0],  b[0] 等於 &b[0][0]   即陣列名是首元素的位址。

6. 多維陣列怪現象: int b[3][4];  則 *b 等於 b,因為 *b = *(&b[0]) = b[0] = &b[0][0] = b

7.多維陣列計算的技巧:

a.對於像 b[1]這樣的位址,最好應表示為&b[1][0]再進行偏移計算;

b.對於有小括號的地方,一定不要省略小括號。比如(&b[1])[1]與&b[1][1]將表示的是不同的結果,第二個是顯然的,對於第乙個(&b[1])[1]=*((&b[1])+1)=*(&b[1]+1)=*(&b[2])=b[2]

例:*(b+1)[1]:*(b+1)[1]=**((b+1)+1)=**(b+2)=*(*(b+2))=*b[2]=b[2][0]  (因為[ ]運算子高於指標

8.對於多維陣列 a[n][m][i][j],那麼這些位址是相同的,即陣列名a, a[0],a[0][0], a[0][0][0], &a[0][0][0][0],都是相同的位址。要得到第乙個元素的值,應該****a,也就是對 4 維陣列需要求 4 次指標運算。同樣可以看到,對陣列名進行的前三次指標運算的值都是相同的,即*a, **a, ***a 和 a 的值都是&a[0][0][0][0]的值。

9.當把 int y[4]賦給指標 int(*p)[4] 時 p=y 將是錯誤的,正確的方式為 p=&y 因為這時編譯器會檢查賦給指標 p 的元素是否是含有四個元素的陣列,如果是就能 正確的賦值.但語句 p=y 中的 y 代表的是陣列 y[4]第一行第一列的元素的位址也就是&y[0]的位址,因此 y 指向的位址只有乙個元素,而指標 p 要求的是有 4 個元素的陣列的位址,因此語句p=y 將出錯。

10.int (*p)[4]與語句 int x[4]等價。

11.動態建立陣列: 

一維:int *p=new int [11];

二維:int (*p)[102]=new int [4][102]    (刪除 delete p;)

12. 動態建立物件的初始化:int *p=new int(102)該語句表明 由p 指向的新建立你物件被初始化為102。

13. 而對於內建型別或沒有預設建構函式的型別,則採用不同的初始化方式就會有顯著不同的差別。例如:int *p=new int; int *p=new int();第一條語句沒

有被初始化,而第二條被初始化為0。

14.用new動態建立的陣列不能被初始化

15.不能在空閒儲存區上建立內建型別元素(除類陣列 string 外)的 const 陣列。因為我們不能初始化用 new 建立的內建型別陣列的元素。

C指標相關

const是乙個修飾符,告訴編譯器這個變數不可以被更改,而指標代表兩個東西,本身和指標所指的位址的內容,那麼指標遇到const將會發生什麼?判斷技巧 如果const出現在指標 的前面,說明不可以通過指標修改內容,所指是const 如果const出現在指標 的後面,說明所指標不可以修改所指物件,指標是...

new和二級指標

new動態分配儲存空間如 int p new int int p new int 10 動態陣列的大小可以是變數或常量 而一般直接宣告陣列時,陣列大小必須是常量 又如 int p1 new int 10 動態分配用於存放整型資料的記憶體空間,將初值10寫入該記憶體空間,並將首位址值返回指標p1 do...

學習 C (1) 指標 new 和delete

1.概念 new typename pointer name new typename delete delete pointer name 注意 1 new之後要判斷,指標是否為null,記憶體被耗盡時,防止程式超界 2 如果用變數分配的記憶體,則不能使用delete int a 5 int p ...