利用指標型別的形參進行反向傳值需要如下幾點:
1.外部實參應定義為實體而非指標,因為外部的實參需要利用實體的空間來儲存內部向外傳遞的資料。(外部若一定要使用指標則看9.利用二維指標實現形參反向傳值)
2.內部形參獲取到的是外部空間的位址,所以內部不能將形參所儲存的位址弄丟了,必須一直讓形參儲存外部空間的位址。
3.反向傳值時,是將被傳遞資料放入到外部實參的空間中的。為獲取外部實參的空間,所以需要對形參進行定址後再傳值。
例如:
/*
fun執行時,e自身有個位址————&e。
因為e是指標所以e儲存的是乙個另外空間的位址,由於函式呼叫時外部使用了a作為實參,所以e儲存的是外部a的位址,*e則是外部a的儲存空間
*/void
fun(
int* e)
intmain()
先回顧一下8.利用指標實現形參反向傳值問題。
具體思路如下:
1.外部定義為實體,傳入實體地址。
2.內部定義形參為一維指標,這樣形參指向外部實體。
3.對形參定址獲取外部實體空間,將要返回的值賦給外部實體空間實現對外傳值。
這裡將所有部分都進行「更一維指標化」就實現了利用二維指標進行反向傳值操作。
具體思路如下:
1.外部定義乙個一維指標,傳入該指標的位址。
2.內部形參定義為二維指標,指向外部的一維指標。
3.對形參進行定址獲取外部指標,再進一步定址獲取外部指標指向的空間。通過賦值語句就實現向外部指標所指空間傳值操作。
例如:
#include
#include
#include
/*************************************定義部分*************************************/
typedef
struct node elem;
void
fun(elem*
* e)
/*************************************使用部分*************************************/
intmain()
至此可以優化一下linklist的**,讓getelem函式形參使用二維指標,這樣在外部呼叫時實參可以定義為指標而非實體可以節約一定的空間效能。同時內部迴圈體游標利用指標將會更省效能。
觀察問題8和問題9的**發現乙個共同點在於:函式呼叫時,傳入的引數都不是外部變數所儲存的值,而是傳入了外部變數的位址,而內部形參則被定義為了比外部變數更高乙個維度的指標。這個共同點反映了利用形參進行反向傳值的核心思想————讓函式內部的形參指向外部空間!通過對形參定址來傳值給外部空間。
基於這一核心思想,可以實現利用三維(或更高維度的)指標實現形參的反向傳值操作。
這一思想與其他高階語言中的「引用」傳遞有異曲同工之妙(傳遞的不是值,而是引用)。
C語言指標傳參問題
void pointer int p intmain the p is0xbfd46498 addr is 1076599652,p is 22the p is0xbfd46498 addr is 1076599680,p is 22the p is0xbfd46498 addr is 107659...
C語言 函式傳參 傳值 傳指標 傳指標的指標
本文參考這兩篇文章 文章 一 文章二。在學習資料結構中建立單鏈表的時候,疑惑 已經定義了node,用到結構體指標的時候直接用 node就好了,為什麼還要再定義乙個 linklist呢,為什麼傳參的時候又要用linklist l呢?下面我們就來循序漸進,由淺入深來解決問題,這裡舉兩個例子作為比較。首先...
C語言 指標 「空指標」傳參問題
再談一談空指標傳參。寫平衡二叉樹時,因為傳遞進去了乙個結點,而結點指向空,所以無論其他地方怎麼改,都頻頻報錯。對於普通指標,我們要分清如果乙個指標本身是null,那意味著它指向空 但是,指標也是資料,他的二級指標可不是null,而是這塊指標的位址。void changep int p int mai...