在單鏈表的建立和插入過程中,我們運用了二級指標,但是這裡好像用一級指標也沒啥問題,就這從網上摘抄了下面筆記
這是原文連線
函式中傳遞指標,在函式中改變指標的值,就是在改變實參中的資料資訊。但是這裡改變指標的值實際是指改變指標指向位址的值,因為傳遞指標就是把指標指向變數的位址傳遞過來,而不是像值傳遞一樣只是傳進來乙個實參副本。所以當我們改變指標的值時,實參也改變了。
仔細看函式initlist2(linklist *l) 可以發現,在該函式中改變了指標的指向,也就是改變了指標自身的值。對比一下按值傳遞,這裡的"值"是乙個指標,所以我們要想指標本身的改變可以反映到實參指標上,必須使用二級指標。
下面通過看乙個例子來理解:
#include#include#include"string.h"
void fun1(char* str)
void fun2(char** str)
int main (void)
輸出:
分析:在fun1中,當呼叫str = (char *)malloc(sizeof(char)*13)分配空間]時,str和s已經沒什麼關係了,相當於在fun1中複製了乙個指標,這個指標指向的空間儲存了字串「test string」,但s仍指標null。當呼叫fun2時,因為是二級指標,s指向str,這裡str = (char *)malloc(sizeof(char)),*str就是s,所以給*str分配空間就是給s分配空間。這樣解釋應該就很清楚了。
畫圖為例:
fun1執行時:
fun2執行時
如圖所示,在fun1種str是s的拷貝,給str分配空間跟s沒有關係,在fun2種str是二級指標,指向s,能夠通過控制*str從而給s分配空間。
就是說我們用單鏈表建立或者插入的時候,是需要給指標指向的地方建立或者釋放空間的,如果是使用一級指標,是傳遞指標的值,指標的指向是不變的,也就是說傳遞之前指標指向什麼,函式結束後指標也是指向什麼.而二級指標是可以改變指標的指向的,(也就是指標的位址,我自己這麼理解)可以將指向null的指標指向一段建立好的記憶體空間.
線性表 鏈式儲存結構之單鏈表
ifndef linklist h define linklist h include include include template class node node const elemtype data data data next null node const elemtype data,...
線性表鏈式儲存結構
include include 線性表鏈式儲存結構 typedef struct lnodelnode,linklist int initlist linklist l 初始化 int endinsert linklist l,int e p next s return 1 末尾插入元素 int g...
線性表鏈式儲存結構
為了表示每個資料元素ai與其直接後繼資料元素ai 1之間的邏輯關係,對資料元素ai來說,除了儲存其本身的資訊之外,還需儲存乙個指示其直接後繼的資訊 即直接後繼的儲存位置 我們把儲存資料元素資訊的域稱為資料域,把儲存直接後繼位置的域稱為指標域。指標域中儲存的資訊稱做指標或鏈。這兩部分資訊組成資料元素a...