指標相關問題
1.指標陣列,陣列指標
2.指標函式,函式指標
3.指標常量,常量指標
4.指標和引用的區別
5.指標和陣列
6.陣列名退化為指標
7.如何避免野指標
8.含有虛函式類的大小(虛表指標)
9.指標作為函式引數
1.陣列指標:int (*p)[n] ;
指標陣列:
int *p[n];
陣列指標
如要將二維陣列賦給一指標,應這樣賦值:
int a[3][4];
int (*p)[4]; //該語句是定義乙個陣列指標,指向含4個元素的一維陣列。
p=a; //將該二維陣列的首位址賦給p,也就是a[0]或&a[0][0]
p++; //該語句執行過後,也就是p=p+1;p跨過行a[0]指向了行a[1]
所以陣列指標也稱指向一維陣列的指標,亦稱行指標。
指標陣列
定義 int *p[n];
優先順序高,先與p結合成為乙個陣列,再由int*說明這是乙個整型指標陣列,它有n個指標型別的陣列元素。這裡執行p+1是錯誤的,這樣賦值也是錯誤的:p=a;因為p是個不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它們分別是指標變數可以用來存放變數位址。但可以這樣 *p=a; 這裡*p表示指標陣列第乙個元素的值,a的首位址的值。
如要將二維陣列賦給一指標陣列:
int *p[3];
int a[3][4];
for(i=0;i<3;i++)
p[i]=a[i];
這裡int *p[3] 表示乙個一維陣列內存放著三個指標變數,分別是p[0]、p[1]、p[2]
所以要分別賦值
參考資料:
2.指標函式,函式指標
指標函式即返回值是指標的函式
int*f(
inta,
intb);
函式指標
int(*f)(
inta,
intb);
// 宣告函式指標
參考資料:
3.指標常量,常量指標
指標常量:指標常量
是指標型別的常量,即指標本身是常量,只能指向固定的區域;但該區域中的內容
可以改變
char
* const c;
常量指標:常量指標
是指向常量的指標,即指標指向區域的內容是常量,不能更改;但該指標可以指向
其它區域。
const
char
*c;
或 char
const
*c;
const
char
* const
c則是,指標本身是常量,它又指向常量。即指標指向固定的區域,並且該區域裡面的內容也是
固定的。
參考資料:
4.指標和引用
1>引用必須初始化,指標則不然。
2>引用不能為空引用,指標則不然。
3>引用在初始化後,不能再引用其他物件,指標則不然。
參考資料:
5.指標和陣列
陣列對應著一塊記憶體區域,而指標是指向一塊記憶體區域。其位址和容量在生命期裡不會改變,只有陣列的內容可以改變;而指標卻不同,它指向的記憶體區域的大小可以隨時改變,而且當指標指向常量字串時,它的內容是不可以被修改的,否則在執行時會報錯。
參考資料:
6.陣列名退化為指標
把陣列作為引數傳遞時,會退化為指標(面試中sizeof,strlen經常會考)
參考資料:
9.指標作為函式引數
如果函式的引數是乙個指標,不要指望用該指標去申請動態記憶體 林銳的《高質量c/c++程式設計指南》
參考資料:
野指標相關問題
最近在學習並行程式設計時注意到了uaf use after free 問題,引發uaf問題的原因一般是因為在釋放了某個指標指向的記憶體後,並沒有將該指標置空,從而可以通過該指標非法地修改記憶體。以前因為一直都沒有寫過大型專案,也不曾特別關心安全問題,雖然知道在指標申請後手動置為null但一度以為在f...
指標的相關問題
鳴謝 龍大佬同學 手動滑稽 指標和引用的區別 指標可以指向為空,但是引用一旦繫結了物件,就不能更改,而且繫結不能為空 指標相當於菜刀,而引用就是水果刀,指標的功能更多,但是在某一情況下使用引用比較有針對性。指向函式的指標 返回值為 指向函式的指標 的函式 引數為 指向函式的指標 函式 從右往左看是乙...
C 指標相關問題
b int 表示指向指標的指標 int m 1 int p m int a p c 陣列指標和指標陣列 指標陣列 int int a 3 array of pointers,陣列指標 int int a 3 a pointer to an arraya 定義乙個一維陣列,陣列名是這個陣列的首位址 b...