C 語言初學教材- 第六章雙重指標
文章推薦指數: 80 %
C 語言初學教材- 第六章雙重指標. 重新看一次這張圖 這是說,若我們想在函數 addfriend() 中修改儲存在記憶體位址address_a 的變數值,我們就得把address_a 作為參數值 ...
網頁
導論
G+專頁
G+社群
FB粉絲團
FB社團
微博
YouTube
Twitter
GitHub
關於本站
意見提供或問題回報
新站
公告
《如何自學程式設計》入選GooglePlay台灣地區2016年度最佳書籍|本站於GooglePlay銷售電子書。
預計之後會調整本站內容,凡是有兩個版本的教材,舊版本將刪除。
------
Udemy|Python專案開發入門的二十一堂課|促銷優惠
C語言初學教材-第六章雙重指標
重新看一次這張圖
這是說,若我們想在函數addfriend()中修改儲存在記憶體位址address_a的變數值,我們就得把address_a作為參數值傳遞給addfriend()。
可是傳遞記憶體位址需要指標變數,startPtr不就已經是指標變數了嗎?的確,startPtr就已經是指標變數,我們也需要startPtr這個指標變數來記錄資料結構的起點,不然加入新資料後,我們不知道能夠從哪裡找到資料。
因此startPtr為鏈結串列的入口,若是要用其他函數如addfriend()建立新節點,然後將新節點拿來當作startPtr的初值,那就必須傳遞startPtr的記憶體位址給函數。
startPtr的記憶體仍是指標,不過是指向指標的指標,也就是雙重指標,宣告時需要連用兩個星號
voidaddfriend(LinkedListNode**startPtr);
voidprintList(LinkedListNode*currentPtr);
我們將addfriend()的參數宣告為雙重指標,函數定義如下
voidaddfriend(LinkedListNode**startPtr)
{
LinkedListNode*newPtr,*currentPtr;
charfname[NAME_SIZE];
intfage,fsex,frelation;
//向作業系統要求新的記憶體空間
newPtr=malloc(sizeof(LinkedListNode));
//依序輸入好友資料
printf("\n好友暱稱:");
scanf("%s",fname);
printf("好友年齡:");
scanf("%d",&fage);
printf("好友性別-0.女1.男:");
scanf("%d",&fsex);
printf("好友關係-0.家人1.同學2.朋友:");
scanf("%d",&frelation);
//將好友資料拷貝到剛才取得的記憶體空間之中
strcpy(newPtr->data.name,fname);
newPtr->data.age=fage;
newPtr->data.sex=fsex;
newPtr->data.relation=frelation;
newPtr->nextPtr=NULL;
//將資料加入鏈結串列
if(*startPtr==NULL){
*startPtr=newPtr;
}
else{
currentPtr=*startPtr;
while(currentPtr!=NULL){
if(currentPtr->nextPtr==NULL){
currentPtr->nextPtr=newPtr;
break;
}
currentPtr=currentPtr->nextPtr;
}
}
}
注意,凡是使用到startPtr的地方,全部都需要加上反參考運算子,也就是*startPtr的形式,這樣才能修改原先在函數main()中的值
至於printList()則不需要用到雙重指標,因為直接傳遞startPtr的值即可,若是startPtr為NULL,表示空的鏈結串列,若startPtr儲存任何記憶體位址,就表示鏈結串列中有資料,才需要做印出的動作,其定義如下
voidprintList2(LinkedListNode*currentPtr)
{
if(currentPtr==NULL){
printf("\n\n還沒有建立任何好友資料唷...\n\n");
}
else{
//依序由鏈結串列取出資料,然後印在螢幕上
printf("\n\n以下依好友名錄的儲存順序印出好友資料\n");
printf("好友暱稱-年齡-性別-關係\n");
while(currentPtr!=NULL){
printf("%10s-",currentPtr->data.name);
printf("%5d-",currentPtr->data.age);
printf("%5s-",currentPtr->data.sex?"男":"女");
printf("%s\n",currentPtr->data.relation?"同學或朋友":"家人");
currentPtr=currentPtr->nextPtr;
}
}
}
完整的範例程式碼及編譯執行,請參考
範例程式
編譯執行
一般講C語言有傳址呼叫,多半是說以指標當參數傳遞給被呼叫函數,然而這樣的講法並不十分確實。
如果我們的程式需要某個資料結構,用一個startPtr的指標變數作為資料結構的入口,利用函數增加或減少資料,由於可能會更動startPtr的值,也就是建立第一個節點,或是刪除第一個節點的時候,這時候就必須以雙重指標當成參數,也就是指向指標的指標。
嚴謹的教科書並不會說C語言有傳址呼叫,多半只會講C語言是利用傳值呼叫的方式傳遞參數給函數。
說到底,「傳址呼叫」的說法是一種好分類、好記住的方式,就指標初步的使用來講,大部分情況也都符合。
若是學習C語言一開始就牢記「傳址呼叫」,起初雖然運用起來彷彿觀念很清楚,到雙重指標的部份就可能需要兜一大個圈來理解實際程式的運作情況。
兜怎麼樣的圈呢?就是說傳址呼叫只適用在利用取址運算子&的情況,而非所有指標變數都適用。
然而實際上函數傳遞參數的方法仍是依賴傳值,取址運算子&取得記憶體位址,然後把記憶體位址當成值傳遞給被呼叫函數,在被呼叫函數中再利用反參考運算子*,便可修改該指標變數的值。
我們建議用傳值呼叫理解C程式函數呼叫的運作,至於「傳址呼叫」對C語言似乎是種流行的講法,甚至許多考試都把「傳址呼叫」當考題,所以某種程度上也需要大概知道「傳址呼叫」是說什麼。
問題與討論
說明雙重指標的運作方式。
為什麼說C語言有傳址呼叫並不十分確實?
將資料暫存在記憶體中
記錄通訊錄資料的結構
鏈結串列
範例程式
編譯執行
增加好友
範例程式1
編譯執行1
程式說明
範例程式2
編譯執行2
雙重指標
範例程式
編譯執行
設計自己的標頭檔
實作檔
執行檔
查詢好友
刪除好友
排序列表
登出或離開
itm.h
itmf.c
回C初學教材
回C教材目錄
回首頁
以電子郵件傳送這篇文章BlogThis!分享至Twitter分享至Facebook分享到Pinterest
標籤:
C語言初學教材,
C語言教學
沒有留言:
張貼留言
較新的文章
較舊的文章
首頁
訂閱:
張貼留言(Atom)
搜尋此網誌
RSS訂閱
連結到本站
[email protected]
重要說明
本站教材的設計目標是以高中生到大一程度或程式設計的完全新手為主,尤其《入門指南》系列帶領讀者開發簡單的GUI軟體,簡言之目標為學習開發軟體的流程,其作為學習程式語言的第一本書,而非最後一本書,建議您完成《入門指南》後繼續找尋其他書籍研讀程式設計的技巧及程式語言的細節,語言細節部分也可先參考本站的《快速導覽》或《速查手冊》,謝謝。
本站電子書
GooglePlayBooks
如何自學寫作V1.00
如何自學程式設計V1.00
如何自學程式設計第二部分V2.00
C的一堂課V2.00
C速查手冊V1.00
Python的一堂課V2.00
Python新手之旅V1.10
Python入門指南V4.00
Python速查手冊V2.00
C++入門指南V2.21
C++速查手冊V1.02
Java入門指南V2.11
Swift入門指南V3.00
HTML的一堂課V5.00
CSS的一堂課V1.00
EPUB的一堂課V1.00
iBooksStore
如何自學程式設計V1.00
Python的一堂課V1.00
Python新手之旅V1.10
Python入門指南V2.31
C++入門指南V2.21
C++速查手冊V1.02
Java入門指南V2.11
Swift入門指南V3.00
EPUB的一堂課V1.10
Readmoo
如何自學寫作V1.00
如何自學程式設計V1.00
C速查手冊V1.00
Python新手之旅V1.10
Python入門指南V4.00
Python速查手冊V2.00
C++入門指南V2.20
C++速查手冊V1.02
Java入門指南V2.10
Swift入門指南V3.00
樂天kobo
如何自學程式設計V1.00
如何自學程式設計第二部分V2.00
C的一堂課V2.00
C速查手冊V1.00
Python的一堂課V2.00
Python新手之旅V1.10
Python入門指南V4.00
Python速查手冊V2.00
C++入門指南V2.21
C++速查手冊V1.02
Java入門指南V2.11
HyRead
Python的一堂課V1.00H
Python新手之旅V1.00H
Python入門指南V2.00H
C++入門指南V2.00H
C++速查手冊V1.00H
Java入門指南V2.00H
Swift入門指南V1.00H
印客邦-紙本書
如何自學程式設計(合訂本)V2.00
C++入門指南V2.30(附C的一堂課)
C++速查手冊V1.20
Java入門指南V3.00
Python入門指南V4.10
Swift入門指南V3.00
延伸文章資訊
- 1C 指標變數雙重指標 - 東勢厝yang 雜七雜八亂亂記
C 指標變數雙重指標 · 指標變數 · 定義:指向一般變數,存放的值為變數位址(address)。 · 宣告格式: 資料型態*指標變數 · ex: · int value=5; · int *p...
- 2[C語言] 指標教學[七]: 多重指標. 一般指標 - Medium
我們承襲上一例雙重指標一個雙重指標變數ptr2 指向ptr1 的例子,這裡我們在宣告一個三重指標***ptr3 ,假設它的位址是0x2e,它指向了ptr2,ptr2 再 ...
- 3C/C++ 指標和雙重指標以及三重指標 - Follow Fang!
C/C++ 指標和雙重指標以及三重指標. 指標在C語言內是一個很重要的元素,指標可以指到任何的位置,不過要小心使用,能指到記憶體位置,就代表可以透過 ...
- 4[C Program] C 指標(pointer) (三)雙重指標@ AAA - 隨意窩
[Note] 雙重指標 一般指標範例int main(){ int a = 10; int *ptr = &a; //*ptr存a的位址} 以下為各個變數解說a 的值10 &a 位址0x000a...
- 5C++ 指標的基本宣告以及指標的指標(雙重指標、三重指標...)
c++ 专栏收录该内容. 6 篇文章 0 订阅. 订阅专栏. 這篇文章主要用來記錄學習指標基本的宣告規則以及雙重指標、三重指標…等多重指標之間的存取關係.