改變指標指向

2021-06-13 13:06:10 字數 3329 閱讀 2787

如何通過函式來改變傳入指標的指向?想必大家第一反應就是使用指向指標的指標作為形參,也就是說會寫類似於func_1的函式:

[cpp]view plain

copy

void

func_1(

dword

**ppdw)    

g_dwval是乙個全域性變數,只要知道這個即可,其餘的暫時不用考慮。有了func_1,那麼呼叫估計大家也會想到,無非是傳入乙個指標,如:

[cpp]view plain

copy

pbuf = null;  

func_1(&pbuf);  

如果你認為這是c++通過函式改變指標指向的全部,那麼你就太小看它了。使用"dword **"能改變指標的指向,那是不是通過"dword *"就不行了呢?答案是否定的,形參為"dword *"也可以改變指標指向!不過,這個函式的寫法就有所不同,如func_2:

[cpp]view plain

copy

void

func_2(

dword

*pdw)    

函式寫法不同,呼叫也要有所區別,如:

[cpp]view plain

copy

pbuf = null;  

func_2(reinterpret_cast

<

dword

*>(&pbuf));  

如果你測試過這段**,那麼會發現即使函式形參是"dword *",也可以改變指標的指向!

在這裡再稍微多說一點,func_2的函式體,其實寫成這樣也是可以正常賦值的,如:

[cpp]view plain

copy

void

func_2(

dword

*pdw)    

我們再來看乙個更加有趣的問題,如果指標的型別是byte,那麼是不是也能正常改變呢?所以,我們便有了乙個func_3函式:

[cpp]view plain

copy

void

func_3(

byte

*pb)    

呼叫的時候,自然也是有所區別:

[cpp]view plain

copy

pbuf = null;  

func_3(reinterpret_cast

<

byte

*>(&pbuf));  

經過測試,這樣的方式也是能夠改變指標的指向的。估計看到這裡,應該不少朋友迷惑了,為什麼呢?在回答這個問題之前,我們繼續再看另乙個更有趣的問題,不通過指標,而是通過"dword"型別來改變指標的指向!於是,便有了函式func_4:

[cpp]view plain

copy

void

func_4(

dword

dwval)    

不用想,呼叫方式自然也是有區別,如:

[cpp]view plain

copy

pbuf = null;  

func_4(reinterpret_cast

<

dword

>(&pbuf));  

估計很多初學者看到這裡,應該已經兩眼發暈了吧?我們不妨看看為何可以改變的真正原因。

要明白上述函式為何能夠正常改變指向,那麼就必須明白指標的位址。對於指標的位址,它其實分為兩部分,一部分是指標本身的位址,另一部分則是指標指向的位址。這樣說可能大家有點糊塗,不妨看如下的圖示:

假設有個指標,名為pbuf。對於圖中的0x4000 0000來說,這是指標本身的位址,以**表示,便是&pbuf;而0x4000 0000這個記憶體位址儲存的0x8000 0000,便是指標指向的位址,**表示為pbuf;至於0x1234 5678,不用說,就是0x8000 0000這個記憶體塊的數值了,**自然是*pbuf。根據這些內容,不難得出這個表:

**

0x4000 0000

&pbuf

0x8000 0000

pbuf

0x1234 5678

*pbuf

還是以圖為例子,如果要改變指標的指向的話,那麼只需要改變0x4000 0000這個記憶體裡面的數值即可。明白這點,對於之前的函式理解就沒什麼難度了。大家不妨回頭看看,其實在呼叫這些func_x函式時,傳入的都是"&pbuf",也就是指標本身的位址。既然已經知道了指標本身的位址,那麼改變指標儲存的值還有什麼問題麼?函式所做的,只不過是一些轉換而已。

按理說,本文到此已經結束,但最後不妨再看乙個初學者非常容易搞混的問題:空指標是否佔據記憶體空間?也就是說,下面這行**是否佔據記憶體空間: 

[cpp]view plain

copy

dword

*pbuf = null;  

答案是占有空間!如果對此還有疑惑,那麼看了下面這張圖,相想必就非常明白了:

所謂的空指標,只不過是指向記憶體位址為0x0000 0000的指標而已,和別的指標並沒有任何不同,所以肯定占用空間。

這裡,應該還會有人迷惑,如果指向指標的指標為空,那麼會不會占用空間呢?也就是說下面這行**:

[cpp]view plain

copy

dword

**ppbuf = null;  

答案還是占用空間!指向指標的指標說白了,還是指標,既然是指標就有自己本身的位址,所以肯定占用空間!所不同的是,指向指標的指標的儲存空間儲存的是所指向的指標的位址而已。如果以第一幅圖為例子,稍微完善一下,那麼便有如下圖示:

[cpp]view plain

copy

#include "windows.h"

dword

g_dwval = 0x100;  

void

func_1(

dword

**ppdw)  

void

func_2(

dword

*pdw)  

void

func_3(

byte

*pb)  

void

func_4(

dword

dwval)  

int_tmain(

intargc, _tchar* argv)    

改變指標的指向

通過函式改變指標的指向,則函式的入參需要是指標的位址,即引數型別為指向指標的指標。如果僅僅是指標變數,則通過 賦值改變的是指標所指向變數的值,而不是指標的指向。而給指標本身賦值,則改變的是函式裡指標變數的值,而不會傳遞到呼叫函式裡的指標變數。例子1 入參為指向指標的指標 include using ...

this指向 改變this指向

常見的this指向 常見的this指向 全域性下的this指向window 函式中的this,誰呼叫指向誰 建構函式中的this指向建構函式的物件 物件中的this預設指向當前物件 事件處理函式中this誰觸發指向誰 指向觸發事件的目標元素 定時器函式,this 指向 window 箭頭函式中沒有t...

this指向 改變this指向

function a a 此處相當於window.a 這僅是我個人的理解 在這個 中我們可以看出在 的結尾是由window來呼叫的函式a,那麼這個時候this指向window,this.user,全域性中沒有user,所以先定義了,但是沒有賦值,所以列印出undefined this指向練習二 va...