指標相關問題

2021-06-28 01:15:01 字數 1893 閱讀 3275

指標相關問題

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...