第8章指標

2021-06-06 18:48:57 字數 1708 閱讀 9874

1. 指標:指標是儲存記憶體位址的變數。在記憶體中每一塊儲存單元都有相對應的唯一的位址編號,指標就是一塊儲存這種編號的空間

2. 對於乙個變數可以用&符號來獲取它的位址

int a;

int * p = &a;

什麼樣的變數,就需要宣告對應的型別的指標。這是為了告訴系統,我從這個位址開始要讀取多少位的記憶體塊,才能正好把變數讀取出來。

4. 指標宣告完成後必須初始化確定的值或是空指標。int * p=0或是int * p=null,這表示初始化為空指標

5. 如何通過指標來獲取變數的內容,比如(3)中,通過p來獲取a的資料,我們可以用*p來完成。

6. 陣列名其實是乙個常量指標。int num[5]; num就儲存的陣列的最一開始的第乙個陣列單元的位址,也就是num[0]儲存單元的位址。可以用num+1就是num[1]的位址,表示從num,把指標向後推乙個int大小的寬度。

7. int num1[10];

int * num2[10];

int * num3 = new int[10];

第二個是定義了乙個指標陣列,也就是陣列裡面儲存的是整型的指標,同樣num2是常量

第三個是定義了乙個指標變數num3,這個變數儲存了定義的乙個陣列的位址。

8. 在記憶體中,區域性變數和函式引數位於堆疊中,**位於**空間,全域性變數位於全域性命名空間,暫存器用於記錄棧頂指標活指令指標等內部管理工作。剩餘的記憶體被用作自由儲存區,常稱為堆。

9. 函式返回是堆疊被清空,程式結束後,自由儲存區不會被清空,所以程式設計師必須記得曾經申請的記憶體,並在程式結束時將其釋放。

10.通過new可以申請自由儲存空間的記憶體,不過申請後必須自己主動釋放,不然,就算申請的變數不用了,記憶體也不會自動釋放。所以一般是在建構函式中申請記憶體,在析構函式中用delete釋放記憶體。記憶體釋放後,最後對原變數設定成空指標,以免以後的操作出現問題。

11.定義了乙個指標,如果再重複定義會導致記憶體洩露,所以在定以前要先釋放。比如:

int * p = new int;

p=new int;

這樣就是錯誤的,因為第一句已經申請了一塊記憶體,而第二句又申請了一塊記憶體。第一句申請的記憶體沒有釋放,第二句p又被重新賦值,所以第一句申請的記憶體位址得不到了,但是它一直被占用的。

12.迷途指標。如果乙個指標你呼叫了delete後,沒有至空,又對其操作,比如

int *p = 10;

delete p;

*p=20;

在*p=20這句的時候p就成了迷途指標。要明白delete p,並不是把p清空,而是通過p找到p所指的記憶體位址處,並把此處的記憶體位址釋放,也就是告訴作業系統,這一塊位址又是自由空間了,可以對其賦值了。這時p內任然儲存這這塊位址,但這塊位址已經是釋放的了。如果你再對這裡進行操作,那就相當於你對記憶體裡面的任意一塊地方隨意操作一樣,是很危險的。

13. const int * p1;

int * const p2;

const int * const p3;

第乙個表示指向乙個整型常量的指標。也就是p1是個指標變數,它儲存的是乙個整型常量的位址,這個整型常量的位址是可以變得,也就是p1裡面的值是可以變得,但是它指向的這個整型常量是不可以變得。

第二個是指向乙個整型的常量指標。也就是p2是乙個常量,p2一但賦值,就不可改變,但是它指向的這個位址是乙個整型變數,可以改變。

第三個是乙個指向整型常量的常量指標。也就是p3是個常量,它指向的位址也是乙個常量。

下章見(以上全是個人觀點,如有不當,敬請提出)

第4章 陣列和指標 8

4.3.1 建立動態陣列 陣列型別的變數有三個重要的限制 陣列長度固定不變,在編譯時必須知道長度,陣列只在定義它的塊語句內存在。雖然陣列長度是固定的,但動態分配的陣列不必在編譯時知道其長度,可以 通常也是 在執行時才確定陣列長度。與陣列變數不同,動態分配的陣列將一直存在,直到程式顯式釋放它為止。每乙...

C和指標 第8章 陣列

1.2 2 arry arry 2 arry 2 1.3下標絕不會比指標更有效率,但指標有時會比下標有效。結論 1.當根據某個決定數目的增量在乙個陣列中移動的時候,使用指標比使用下標產生效率更高的 當這個增量是1並且機器具有位址自動增量模型時,這點表現更突出。2.宣告為暫存器變數的指標通常比位於靜態...

C和指標 程式設計練習 第8章

修改問題6 的array offset函式,使它訪問以列為主序的偽陣列,也就是最左邊的下標率先變化.這個新函式array offset2在其他方面與原先的那個函式一樣.例如 假定arrayinfo陣列包含了值3,4,6,1,5,3,3.這些值提示我們所處理的是三維偽陣列.第乙個下標範圍從4 到6 第...