c語言 函式 用指標傳遞引數 問題

2021-07-02 05:35:34 字數 1442 閱讀 6069

問題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中是沒...