score = %d\n", ++ptr->score); printf("ptr->name = %s\n", ptr->name); printf("*ptr->name = %c\n", *ptr->name); printf("*ptr->name++ = %c\n", *ptr->name++); printf("*ptr->name = %c\n", *ptr->name); printf("(*ptr->name)++ = %c\n", (*ptr->name)++); printf("*ptr->name = %c\n", *ptr->name); printf("*ptr++->name = %c\n", *ptr++->name); }"> score = %d\n", ++ptr->score); printf("ptr->name = %s\n", ptr->name); printf("*ptr->name = %c\n", *ptr->name); printf("*ptr->name++ = %c\n", *ptr->name++); printf("*ptr->name = %c\n", *ptr->name); printf("(*ptr->name)++ = %c\n", (*ptr->name)++); printf("*ptr->name = %c\n", *ptr->name); printf("*ptr++->name = %c\n", *ptr++->name); }">

Presentation is loading. Please wait.

Presentation is loading. Please wait.

第十章 再論結構. 指標與結構的關係 /* File name: ex10-1a.c */ #include int main() { struct student { char *name; int score; }; struct student st= {"Brian", 97}; struct.

Similar presentations


Presentation on theme: "第十章 再論結構. 指標與結構的關係 /* File name: ex10-1a.c */ #include int main() { struct student { char *name; int score; }; struct student st= {"Brian", 97}; struct."— Presentation transcript:

1 第十章 再論結構

2 指標與結構的關係 /* File name: ex10-1a.c */ #include int main() { struct student { char *name; int score; }; struct student st= {"Brian", 97}; struct student *ptr=&st;

3 指標與結構的關係 printf("++ptr->score = %d\n", ++ptr->score); printf("ptr->name = %s\n", ptr->name); printf("*ptr->name = %c\n", *ptr->name); printf("*ptr->name++ = %c\n", *ptr->name++); printf("*ptr->name = %c\n", *ptr->name); printf("(*ptr->name)++ = %c\n", (*ptr->name)++); printf("*ptr->name = %c\n", *ptr->name); printf("*ptr++->name = %c\n", *ptr++->name); }

4 指標與結構的關係 程式解說: 程式中的結構宣告與定義,如下圖所示: ptr name 97 "Brian" &st

5 指標與結構的關係 (1) ++ptr->score 由於 -> 運算優先順序高於 ++ ,故上述等於 ++(ptr->score) ,表示 ++ 乃作用於 (ptr- >score) 之上,原先 score 為 97 ,故將其 加 1 ,並更新之 ptr name 98 "Brian" &st

6 指標與結構的關係 (2) ptr->name 此敘述相當於 (*ptr).name ,以 %s 印出為 Brian (3) *ptr->name 相當於 *(ptr->name) ,得到的是 B 字元 (4) *ptr->name++ 表示 *(ptr->name)++ ,由於 * 和 ++ 的運算 優先順序相同,並且其結合性是由右至左, 故此處的 ++ 乃作用於 ptr->name ,因此敘述 執行完畢後,得到 B 字元之後,將 name 的指 標移到 r 的位址上

7 指標與結構的關係 (5) *ptr->name 驗證上述 name 的指標是否有指向下一個字 元,答案是 r ptr name 98 "Brian" &st

8 指標與結構的關係 (6) (*ptr->name)++ 此處的 ++ 是針對 (*ptr->name) 而來,因 *ptr->name 為 r ,故將其加 1 (即其下一個 字元), r 字元會變更為 s ptr name 98 "Bsian" &st

9 指標與結構的關係 (7) *ptr->name 輸出結果為 s (8) *ptr++->name 由於此處的 ++ 乃作用於 ptr ,由於它是後 繼加,故先得到 s 值後, ptr 往下指向下一 個結構,若此時問 *ptr->name 為何?則答 案是 garbage ,因為它已指向一個不是本題 所屬的記憶體了

10 指標與結構的關係 範例 ex10-2 a.c /* File name: ex10-2a.c */ #include int main() { struct student { char *name; int score; struct student *next; }; struct student st[]= {{"John", 90, st+1}, {"Mary", 85, st+2}, {"Peter", 92, st} }; struct student *ptr=st;

11 指標與結構的關係 printf("st[0].name = %s\n", st[0].name); printf("(*st).name = %s\n", (*st).name); printf("ptr->name = %s\n", ptr->name); printf("st[1].next->name = %s\n", st[1].next->name); printf("st[1].next->score = %d\n", st[1].next->score); printf("++(ptr->name) = %s\n", ++(ptr->name)); printf("++ptr->name = %s\n", ++ptr->name); printf("ptr->next->name = %s\n", ptr->next->name); printf("ptr->next->score = %d\n", ptr->next->score); }

12 指標與結構的關係 程式解說: 程式中的結構宣告與定義,如下圖所示: name 85 92 "Mary" "Peter" next name 90 "John" next st[0] st[1] st[2] st st +1 st + 2 ptr

13 指標與結構的關係 (1) st [0].name 以 %s 印出 其值為 John (2) (*st).name 以 %s 印出 同 (1) 效果 (3) ptr->name 因為 ptr 開始時設定在 st ,故 ptr->name 等於 st[0].name 或 (*st).name ,皆為 John

14 指標與結構的關係 (4) st[1].next->name 其相當於 (st[1].next)->name ,因為. 和 - > 具有相同的運算先順序,並且其結合性為 由左至右,由於 st[1].next 指向 st+2 ,故 st[1].next->name 為 Peter (5) st[1].next->score 其值為 92 (6) ++(ptr->name) 以 %s 印出 其值為 ohn ,因為此處的 ++ 為前置加,故先 將 name 的指標指向下一個字元位址後,再 印出其值

15 指標與結構的關係 (7) ++ptr->name 以 %s 印出 此敘述相當於 ++(ptr->name) ,同 (6) 其值 為 hn (8) ptr->next->name 以 %s 印出 其結果為 Mary ,因為 ptr->next 指向 st+1 (9) ptr->next->score 其值為 85

16 指標與結構的應用 再論鏈結串列 加入與刪除之作用點不限定在哪,而要依據 題意加以搜尋 完整程式請參閱 ex10-2b.c

17 指標與結構的應用 鏈結串列加入之片段程式 搜尋加入之位置 current = head; while (current!=NULL && strcmp(new_node-> id,current->id) >= 0) { prev = current; current = current → next; }

18 指標與結構的應用 加入之動作 if (current == head) /* 加入在前端 */ { new_node→next = head; head = new_node; } else { new_node→next = current; prev→next = new_node; }

19 指標與結構的應用 鏈結串列刪除之片段程式 搜尋欲刪除之節點 if (current = = head) { head = current->next; free (current); } else { prev->next = current->next; free (current); } current 指標指向欲刪除的節點,而 prev 則指 向欲刪除節點的前一節點


Download ppt "第十章 再論結構. 指標與結構的關係 /* File name: ex10-1a.c */ #include int main() { struct student { char *name; int score; }; struct student st= {"Brian", 97}; struct."

Similar presentations


Ads by Google