C 速查手冊- 6.3.1 自我參考的結構 - 程式語言教學誌
文章推薦指數: 80 %
結構(structure) 中不能有與自己相同識別字(identifier) 名稱的結構,但可以有指向相同識別字名稱結構的指標(pointer) ,這是說C 語言可以簡單的利用結構與指標把資料 ...
C速查手冊
6.3.1自我參考的結構
結構(structure)中不能有與自己相同識別字(identifier)名稱的結構,但可以有指向相同識別字名稱結構的指標(pointer),這是說C語言可以簡單的利用結構與指標把資料連接起來,形成複雜的資料結構(datastructure)。
如下例定義了一個結構list,其中有一個成員宣告為指向list的指標
#include
下面替三個List變數設定成員值
a.name="John";
b.name="Mary";
c.name="Tony";
底下繼續將a的位址指派給額外宣告的指標startPtr
startPtr=&a;
這是說將a作為此資料結構的起始點,同時利用額外的指標進行操作。
因為從指標可以輕易的取所指向結構的成員,指標也可以當成控制變數,因而使用指標得以容易遊走在資料結構中。
List型態結構的另一個成員nextPtr,便是指向下一筆資料項目的位址。
接下來
a.nextPtr=&b;
b.nextPtr=&c;
c.nextPtr=NULL;
此例中把a當成第一筆資料,也就是資料結構的起始項目,b是第二筆資料,c為第三筆資料,因此a的nextPtr指向b的位址,而b的nextPtr指向c。
由於c為最後一筆資料,因此將c的nextPtr設為NULL,NULL是C語言標準程式庫(standardlibrary)所定義的一個特別的值,代表無效的指標。
最後的while迴圈
while(startPtr!=NULL{
printf("%s\n",startPtr->name);
startPtr=startPtr->nextPtr;
}
最後使用了一個迴圈(loop),這個迴圈的結束條件為startPtr等於NULL。
此迴圈的任務為印出指標所指向結構的name成員,然後把startPtr重新指派給所指向結構的nextPtr成員。
由於startPtr最初的值為a的位址,所以第一次進入迴圈會印出a的name成員,同時a的nextPtr成員的值會重新指派給startPtr。
我們之前是將a的nextPtr設定成b的位址,所以第二次進入迴圈時,startPtr指向的是b,之後的動作皆可類推。
這樣的資料結構稱之為鍵結串列(linkedlist),所有的資料可以分開儲存在不同非連續的記憶體位址。
須留意一點,這裡用一個簡單的方式說明C語言的結構與指標的一般應用,而非建立實際可有效運用的資料結構。
複雜的資料結構還需要用標準程式庫中的malloc()向作業系統借記憶體空間,不需要使用後還得用free()將借來的記憶體空間還給作業系統,真正大型的C程式就需要大量的運用malloc()與free()及其他記憶體相關的函數做記憶體管理。
上一頁6.3結構
回C速查手冊首頁
下一頁6.4聯合
回C教材首頁
回程式語言教材首頁
延伸文章資訊
- 1[C語言]指標、陣列與結構 - HackMD
可動態配置/釋放記憶體; 不同的函式可共享大量的儲存空間; 改善程式存取資料的效率. 指標 ...
- 2C 速查手冊- 6.3.1 自我參考的結構 - 程式語言教學誌
結構(structure) 中不能有與自己相同識別字(identifier) 名稱的結構,但可以有指向相同識別字名稱結構的指標(pointer) ,這是說C 語言可以簡單的利用結構與指標把資料 ...
- 3C語言結構體指標詳解 - 程式人生
比如指向struct STUDENT 型別的結構體變數,那麼指標變數就一定要定義成struct STUDENT* 型別。 下面將前面的程式用指標的方式修改一下:. # include < ...
- 4[C 語言] 程式設計教學:如何使用結構(Struct) | 開源技術教學網
由於C 沒有內建的物件導向語法,使用指向結構的指標來模擬C++ (或Java 或C#) 的this ... 由於我們從堆積(heap) 動態配置記憶體,在程式尾段要記得將記憶體釋放掉。
- 5C語言- 第三十二章| struct - 結構與指標
C語言教學,struct - 結構與指標,示範了如何宣告struct指標,以及如何使用&對struct實例取位址值,如果使用struct的指標來存取其成員,則必須使用-> ...