分析傳遞指標的指標

2021-08-25 20:24:34 字數 664 閱讀 7126

很多人都應該記得一道很經典的c的面試題:

void newstring(char *arga)

看到這個題目大家都應該知道答案,並能說出理由是:在傳遞過程中引數會在棧上做乙個複製品,在函式體內進行操作的是這個複製品。這也就時我們為什麼在休要修改乙個變數值是要傳遞指標的原因了。如圖所示:

我們這時操作的是arga這個變數的值,而不是a的值。如果傳入指標,同樣是有乙個複製,但是是我們的目標操作物件不是指標本身而是指標指向的堆上的乙個區域。這是操作這個值是沒有問題的,但是如果我們要修改指標指向的位置,也就是說要重新給指標賦值,那樣的話傳遞指標就不可能實現了。解決方案是傳遞指標的指標,這樣複製品中儲存的是指標本身的位址,修改這個複製品指標指向的值也就是修改原來指標中儲存的位址。

如此我們在理論上了解的問題產生的原因和解決的方案。但我有這樣的疑問為什麼會產生複製呢?

將**反彙編檢視一下,通過%edi暫存器來傳遞引數,在函式體內部通過edi的低位把引數複製棧的空間中,到如下:

而傳指標和傳指標的指標的**diff的結果如下:

究其原因是因為記憶體和cpu為了儲存執行現場進行了壓棧操作,把引數放到了暫存器%rdi中進行傳遞,這樣就事實上產生了乙個複製過程。同樣的道理,但是這裡傳遞的是棧中位址賦值給rdi還是棧中內容賦值給rdi。

通過彙編來分析c**確實能夠讓自己看的更明白。以後繼續,嘻嘻~~~

傳遞指標和傳遞指標的指標

總是不懂指標 看了乙個csdn的問題 豁然開朗 在寫乙個棧的東西,在銷毀的時候有點小問題 define position int define size t int define elemtype char define buttom 1 struct ststack typedef struct ...

指標傳遞分析與解決

mypointer lference.exe 應用程式錯誤 0x6b207369 指令引用的 0x6b207369 記憶體。該記憶體不能為 read 要終止程式,請單擊 確定 要除錯程式,請單擊 取消 確定 取消 如下為出錯原始碼 void set arrayvalue error 01 unsig...

關於指標傳遞和指標的指標

一開始沒有理解,導致對這個概念非常的模糊和不解。最近看完 徹底搞定c語言指標詳解 裡面關於指標的指標的解釋有了頓悟感。其實,很好理解,是我把它想複雜了。我們都知道,實參和形參的區別。形參並無法改變實參,這就是值傳遞。還有一種叫指標傳遞,實質就是去操作指標的指向物件。例子如下 exchg2 int p...