1. 指針 vs. 引用
- 非空區(qū)別: 引用不能為 NULL
- 合法性: 引用永遠合法
- 可修改區(qū)別:引用的指向只能初始化,不能修改
- 存儲空間區(qū)別:引用不是變量,本身并不占用任何存儲空間
- 應用區(qū)別: 根據(jù)上述特點,決定應用場景
2. 指針作為函數(shù)參數(shù):void fun ( char * p);fun(str);
- *p 只是str的副本,雖然與str指向相同,可以修改str指向地方的內(nèi)容,但不能修改str的指向!函數(shù)返回時,*p消失??梢杂靡韵路椒ǎ淖僺tr的指向。
- void GetMemory ( char ** p)
- char * GetMemory ( char * p)
3. 數(shù)組與指向常量的指針:
- char a[] = "abc" 局部數(shù)組
- char *a = "abc" 局部指針,指向數(shù)據(jù)區(qū)字符串常量,這個常量不可修改!
4. 指針相減結(jié)果為“元素個數(shù)”,而不是真正地址空間的差:
- int *p, *q; q-p; 相當于 (p指向的地址)-(q指向的地址)/ sizeof(int)
- 不同類型的指針不能相減!
5. 類中的函數(shù)對于類中變量的引用,采用的是相對于類的偏移地址的方式(并不是通過變量名匹配的)。
6. 函數(shù)指針: void ( * fun) ( void )
- Int ( * ( *F ) (int, int) ) ( int )
- F 指向函數(shù) A
- A:兩個int參數(shù),返回一個函數(shù)指針B
- B:指向函數(shù)C
- C:一個int參數(shù),int返回值
7. 指針數(shù)組與數(shù)組指針:
- 指針數(shù)組:int *p[] 一個數(shù)組,里邊的元素都是指針
- 數(shù)組指針:int (*p)[] 一個指針,指向一個數(shù)組,指針加1,則指向下一個數(shù)組(移動整個數(shù)組長度)!
- 主要看p和[]結(jié)合(是數(shù)組),還是與*結(jié)合(是指針),默認[]有優(yōu)勢
- float (**def)[10]:def 指向(指向 float[10] 的指針)
- float *(*def)[10]:def 指向(float * [10] 數(shù)組)
8. 數(shù)組名就是數(shù)組首地址(并且是常量,不可改變??!),對數(shù)組名取地址,得到的是數(shù)組指針
- int a[10]; int *ptr = (int *)(&a + 1); ptr指向a中最后一個元素之后
9. delect p; 釋放p所指向的內(nèi)存區(qū)域,但是沒有改變p的指向??!需要p = NULL; 空指針
10. 兩種動態(tài)內(nèi)存分配方式:
- malloc / free:分配內(nèi)存的函數(shù),需要給出具體分配內(nèi)存的大小,不運行構造/析構函數(shù)
- new / delete:C++運算符,分配內(nèi)存,自動計算分配內(nèi)存的大小,且運行相應的構造/析構函數(shù)
11. 句柄:32位 int,windows 對象物理地址的索引,指向指針的指針。
- 句柄地址(穩(wěn)定)-> 記載著對象在內(nèi)存中的地址 -> 對象在內(nèi)存中的地址(不穩(wěn)定)-> 實際對象
12. 管理指針成員 (類中的指針成員的復制控制,解決多個類對象共享一個指針的問題)
- 具有指針成員的對象一般需要定義復制控制成員
- 常規(guī)指針:共享,無法防止懸垂
- 智能指針:共享,通過計數(shù)類,記錄有多少對象共享一個指針(不能用static,因為不同對象(如基類和子類)可以有相同指針),在最后一個共享對象消除之后,計數(shù)類負責指針的撤銷。
|