1 理清函式傳指標變數(線性表)

2021-09-28 14:56:11 字數 2152 閱讀 4759

1.結構體指標變數:指向乙個結構體變數的指標

結構體指標變數的值是相應結構體變數的首位址。

通過結構體指標變數可訪問該結構的成員變數。

一般形式如下:struct 結構名 *結構體指標變數名;

(ps:結構名和結構體變數是兩個不同的概念,不能混淆。

結構名只能表示乙個結構形式,編譯系統並不會對它分配記憶體空間。

只有當某變數被宣告為這種型別的結構時,才對該變數分配儲存空間。)

其訪問結構體變數的各個成員的一般形式為:

(*結構指標變數).成員名

結構體指標變數->成員名

當然結構體變數也可以:3. 結構變數.成員名

三種方式均等效,例如:

#include

#include

intmain()

student=

;struct student *pstruct;

pstruct =

&student;

printf

("name:%s\n",(

*pstruct)

.cname)

;printf

("number:%d\n"

,pstruct-

>inumber)

;printf

("***:%c\n"

,student.c***)

;}

2.關於 l和&l等幾種表述的說明

typedef

struct nodenode,

*linklist;

sturct node結構體型別定義為node,即node表示鍊錶節點的型別.

指標型別定義為linklist,實質是頭指標型別,故一般可以用它表示鍊錶類。(假設有頭節點)

因為因為鍊錶的頭節點的位址知道了(l),那麼整個鍊錶的結點的資料和位址都知道了。

所以可以把頭節點的位址視作整個鍊錶的代表,對指標操作就是對整個鍊錶操作。因此我們對函式傳入鍊錶,實際上是傳入頭指標,就不難理解了

linklist l; 等同於 node *l; 宣告乙個指向node型別的指標變數l。

比如status initlist(linklist &l);等同於 status initlist(lnode *&l);

注意這兩處 不是傳入結構體變數的指標的指標,而是傳入結構體變數指標的引用。

引用變數本身沒有自己的實際儲存空間,對引用變數的操作,就是在操作原變數。

linklist l; 宣告乙個指向node結構體指標的指標變數l。 (所以l與**l分別表示什麼顯而易見)

所以,如果要改變指標l本身的值並儲存,用linklist *l,否則linklist l;

node *p; 宣告乙個node型別的結構體指標p,p是工作指標(初始時p指向) (忽略~)

總結下:重點是明白到底要改變什麼。

一般情況,向函式傳遞指標型別的引數,可以讓函式改變指標指向的內容,並將改變的效果返回;

*當改變指標變數l本身的值,使它指向新開闢的記憶體空間l =(linklist)malloc(sizeof(node)),

而不是要改變l所指向的內容的值,那麼,1.要麼向函式傳遞l的引用linklist &l,2.要麼傳遞指向l的指標(指標的指標)linklist l

typedef

struct

sqlist;

sqlist l;

和單鏈表同理: 傳入l表示函式中l是指標,乙個指向順序表位址的變數。傳入&l表示函式中l是指標(型別)引用,即指原指標。

共同點,都指向順序表的位址 ,如果在函式中修改順序表元素的值,都影響到函式外的值,因為兩者的指標都沒變。

不同點,在函式中修改指標本身所指向的位址,傳入l的情況下函式外元素的值不會發生改變,而傳入&l後函式外元素的值會發生改變。

總結:若要改變順序表的位址並且儲存它則需要用引用,如果不需要改變順序表的位址則不需要用引用。

而l其實就是乙個變數,在這裡是乙個形式引數(即乙個複製原變數的新變數,只存在於該函式中),即指向同乙個位址的不同指標。

也就是說,我們在函式中改變l所指向的位址,並沒有改變本體。

1 線性結構 線性表

由同型別資料元素構成有序序列的線性結構。利用陣列的連續儲存空間順序存放線性表的個元素。typedef struct lnode list struct lnode struct lnode l list ptrl 初始化 建立空的順序表 list makeempty 查詢int find eleme...

線性表專案1 線性表相關函式1

檔名稱 list.h list.cpp main.cpp writer 徐吉平 完成日期 2015年9月14日 版本號 code block 12.11 問題描述 完成建立 輸出線性表,判斷線性表是否為空表,求長度 某個資料元素值等功能 輸入描述 無 程式輸出 輸出線性表及表的長度,資料搜尋的結果 ...

考研複習(1) 線性表

還有5個月考研,還是得敲。環境 ubuntu10.10 ide code blocks 線性表的基本操作,還有合併,比較演算法 include include define list init size 100 define list increase 10 typedef char elemtyp...