問題1:你是把變數傳給了函式,還是把位址傳給了函式?
例: #include
<
stdio.h
>
#include
<
stdlib.h
>
#include
<
string
.h>
void
oxx(
char
*dest)
void
oxx2(
char
*dest)
intmain()
同樣是傳了指標給函式,對指標進行了不同的操作:
1、oxx改變的是「變數」_dest,呼叫函式時傳給_dest的「值」已經被拋棄。然後對_dest重新賦值後,再對其「指向的位址單元」進行操作。由於_dest 「指向的單元」是在函式內部申請的,所以,程式結束之後,_dest和_dest所申請的單元都會被刪除。而_dest的值又沒有通過return來返回給main。所以,它也就沒有改動dest指向單元的內容了。
2、oxx2是對_dest「指向的單元」賦值,_dest又與dest指向相等的「位址單元」,所以,它也就是改變了dest「指向的單元」的值。
或者這麼理解:oxx是把dest當成乙個變數;oxx2是把dest當成乙個載體,對他指向的單元進行操作。
問題2:可不可以return指標,來傳遞引數?
我們得到的忠告是: [不要用return語句返回指向「棧記憶體」的指標,因為該內存在函式結束時自動消亡]
那我們再對記憶體進行一下了解,乙個由c/c++編譯的程式占用的記憶體分為以下幾個部分:
1、棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其
操作方式類似於資料結構中的棧。
2、堆區(heap) — 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os回
收 。注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶,呵呵。
3、全域性區(靜態區)(static)—,全域性變數和靜態變數的儲存是放在一塊的,初始化的
全域性變數和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另
一塊區域。 - 程式結束後由系統釋放。
4、文字常量區 —常量字串就是放在這裡的。 程式結束後由系統釋放
5、程式**區—存放函式體的二進位制**。
例子:某前輩寫的,很詳細~~~
inta =
0; 全域性初始化區
char
*p1; 全域性未初始化區
main()
也就是說&s[0]、&b、&*p2、&*p3是不能用return來放回給呼叫者的,p1,p2,p3的值,即,靜態區記憶體和堆區去記憶體的位址都是可以返回的。
**
C 函式傳遞引用指標引數問題
僅作為參考 記錄 函式如果直接傳遞指標,如呼叫init linklist l l的初始指向為null,對l進行賦值,l指標不在指向null,而是指向new linklist 後的位址,但是無法對傳入的實參進行修改,l仍然指向null 這裡指標的傳遞仍然為值傳遞 初始化鍊錶 status init l...
C語言傳遞指標引數
簡單來說,指標是乙個儲存計算機記憶體位址的變數。所有的指標都儲存了記憶體位址。它們的型別只在取值時起作用。指標在c語言中是個十分重要的概念,可以搜尋相關資料進行深入學習,也可以參考 c語言指標簡介 簡單了解。c語言函式引數傳遞有兩種方式,一種是傳值呼叫,一種是傳址呼叫。那麼如果指標作為引數,應該怎麼...
C語言中函式和指標的引數傳遞
最近寫二叉樹的資料結構實驗,想用乙個沒有返回值的函式來建立乙個樹,發現這個樹就是建立不起來,那麼我就用這個例子討論一下c語言中指標作為形參的函式中傳遞中隱藏的東西。大家知道c 中有引用的概念,兩個資料引用同乙個資料,那麼更改任意的乙個都相當於更改了本體,那麼另乙個資料所對應的值也會改變,可是c中是沒...