我們在使用指標的時候,記住下面的準則可以很好的幫助我們節約修改程式的時間。
建立鍊錶是我們學習資料結構的最基礎的能力。鍊錶這一塊真的就是聽懂容易,上手難。但是解決方法非常樸實,多敲就好!
其實就是,我們建立了乙個結構體。這個結構體裡面有兩個部分,其一是資料區,其二就是我們的指標區(裡面存放的就是下乙個結構體的位址)。
假如我要定義一下關於學生成績資訊的結構體:
typedef struct student
上面的結構體就是我們鍊錶裡面最小的單位。接下來我們就要開始建立單鏈表。這裡呢我們需要介紹一下頭指標,對於整一張鍊錶我們只需要知道指向第乙個節點的位址,那麼我們就可以通過遍歷來獲取整張表的資訊。所以建立鍊錶的時候不要忘記定義乙個頭指標。
int insert(stu *b)//指向鍊錶的最後乙個節點。
else
}
其實在先前一小會兒,我都覺得我的**沒有問題。可是,現在我知道我錯了。雖然思想沒有問題。但是**是真的有問題。因為每次我插入新節點的時候,新建的節點物件。他在記憶體中的位址都被cpu分到了同乙個地方,所以我的鍊錶根本沒有辦法延長。並且非常尷尬的是,最後乙個節點的位址變數指了自己。唯一的解決辦法只有在每插入乙個節點的時候都要重新宣告乙個節點變數,這樣可能才能達到目的。但是這樣做的話,我為什麼不用陣列呢?因為這樣建立鍊錶我也必須事先知道我需要定義多少個變數。
int insert(stu *b)//指向鍊錶的最後乙個節點。
; f=(stu *)malloc(sizeof(stu));//申請空間
scanf("%s %f %f",stu.id,&stu.chinese,&stu.match);//初始化
if(stu.id[0]!=ch[0])
else
}
現在討論一下為什麼我要注釋掉:b=f。原因就是傳引數直接傳值的原因。被傳入引數僅僅只是把自己的內容傳了進去,所有的操作都僅僅實在擁有相同內容的另乙個變數下進行的。
所以進行值傳遞就ok了。
修改**:
int insert(stu* &b)//
; f=(stu *)malloc(sizeof(stu));//申請空間
scanf("%s %f %f",stu.id,&stu.chinese,&stu.match);//初始化
if(stu.id[0]!=ch[0])
else
}
當然傳位址也是一樣的,可以修改指標變數的內容。
int insert(stu* *b)//
; f=(stu *)malloc(sizeof(stu));//申請空間
scanf("%s %f %f",stu.id,&stu.chinese,&stu.match);//初始化
if(stu.id[0]!=ch[0])
else
}
好了指標的部分就到此結束!
完整**:
C C 指標學習
當上面的 被編譯和執行時,它會產生下列結果 通過上面的例項,我們了解了什麼是記憶體位址以及如何訪問它。接下來讓我們看看什麼是指標。指標是乙個變數,其值為另乙個變數的位址,即,記憶體位置的直接位址。就像其他變數或常量一樣,您必須在使用指標儲存其他變數位址之前,對其進行宣告。指標變數宣告的一般形式為 t...
(c c 學習)指標
int p1 定義乙個指向整形的指標,名字是p1 char p2 定義乙個指向字元的指標,名字是p2 如果有 int p 指標變數名是p,而不是 p。在定義指標變數時必須明確其指向的資料型別。在c 中,通過在指標變數前加 的方法來取位址中的資料。int a,p a a前面的取位址運算子一定不可少 i...
C C 學習記錄
include 函式宣告 void func1 void static int count 10 全域性變數 static 是預設的 int main return0 void func1 void 輸出 thingy 為6,count 為9thingy 為7,count 為8thingy 為8,c...