乾貨好文帶你理解C語言中的連結串列

安全劍客發表於2020-10-28
首先,指標計算機中的所有內容都是數字。在C語言中建立變數時,編譯器僅按地址處理它,但是在您的程式碼中,您可以透過兩種方式訪問它:按值和按地址。

乾貨好文帶你理解C語言中的連結串列乾貨好文帶你理解C語言中的連結串列

首先,指標計算機中的所有內容都是數字。在C語言中建立變數時,編譯器僅按地址處理它,但是在您的程式碼中,您可以透過兩種方式訪問它:按值和按地址。

乾貨好文帶你理解C語言中的連結串列乾貨好文帶你理解C語言中的連結串列

在該程式碼中,我使用了三個變數,編譯器將透過地址訪問所有這些變數。

時間-全域性變數-儲存在堆中

skip- 引數-儲存在堆疊中

i- 區域性變數-儲存在堆疊中

“ Hello world-%d \ n”-儲存在堆中

堆是由編譯器與您的程式碼連結的啟動程式碼分配的記憶體塊。建立方式並不重要,但並非所有編譯器都一樣。那是我們想要得到的技術。

為簡化起見,假設變數Times 結束於記憶體位置256(0x100)。堆疊上的變數i 的位置為64(0x40)。文字“ Hello ...”的位置為200(0xc8)。最後,跳過會得到68(0x44)。

現在假設您像這樣呼叫function():

乾貨好文帶你理解C語言中的連結串列乾貨好文帶你理解C語言中的連結串列

這是for迴圈開始時的內容:

時間-儲存在0x100-值為10

跳過-儲存在0x44-值2

i- 儲存在0x40-值0

未命名文字儲存在0xc8-值“ Hello world-%d \ n

現在定址非常簡單。在C語言世界中,當您使用不是指標的變數名時,編譯器會將其視為“儲存在地址中的值”。因此,當您使用變數skip時,編譯器將使用“儲存在0x44處的值”。該程式碼段中的所有變數均為“按值”,表示僅使用值。指標是變數的地址。假設我們這樣做:

乾貨好文帶你理解C語言中的連結串列乾貨好文帶你理解C語言中的連結串列

現在,您有了一個名為TimesPtr 的變數。像所有其他變數一樣,它具有與之關聯的記憶體地址。但是透過將其定義為指標,您可以指定其值為記憶體地址。

因此,使用上述所有數字,我們還將新增

TimesPtr -儲存在地址260(ox104) -堆疊中的

數-儲存在地址263(量0x108) -在堆

我們已將TimePtr 分配為Times 的地址,即0x100。在迴圈開始時,我們指定i = 0,因此0儲存在0x40中。我們還分配Num ,它也是指向整數0的指標。編譯器將建立程式碼,0被放入量0x108,地址數。

當您使用'*'運算子時,您正在告訴編譯器使用您指定的變數“儲存在地址中的值”。當僅使用變數名時,您將告訴編譯器“儲存的值”。

順便說一句,在printf()呼叫中,將文字的地址傳遞給函式printf(),因為文字在編譯器中僅具有一個地址,而不是名稱(並且陣列透過地址傳遞,並且該文字是一個字元陣列) )。

建立連結串列最簡單的方法是簡單地將一個指標新增為指向該結構本身的結構成員。它是這樣完成的:

乾貨好文帶你理解C語言中的連結串列乾貨好文帶你理解C語言中的連結串列

如果要使用typedef ,則不能使用typedef 名稱,因為它尚未定義。假設我們想將_student 結構引用為studentT 。程式碼如下所示:

乾貨好文帶你理解C語言中的連結串列乾貨好文帶你理解C語言中的連結串列

現在,next將是列表中下一個節點的地址,如果沒有,則為NULL。

乾貨好文帶你理解C語言中的連結串列乾貨好文帶你理解C語言中的連結串列

這是建立連結列表的最簡單方法。只需建立一個節點,將其下一個指標分配給列表地址,然後將列表頭分配給該節點的地址。在類中,您最好處理strdup(),並記住在刪除節點時將其釋放。

現在,您需要在單個連結串列中插入和刪除的操作。我將為您提供一個通用連結串列,以儲存任何資料型別:

乾貨好文帶你理解C語言中的連結串列乾貨好文帶你理解C語言中的連結串列

原文地址:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2730430/,如需轉載,請註明出處,否則將追究法律責任。

相關文章