c 函式傳遞引數方式,以及返回變數方式的思考

2021-10-06 12:40:31 字數 2079 閱讀 1705

變數名和位址關係討論

函式返回機制

在這兩篇文章中基本上解答了我大部分的關於函式的疑問,在這裡我再次將自己的思考,以下的乙個小例子梳理如下。

#include

using namespace std;

int;

inttest1

(int a)

int&

test2

(int

&a)int

*test3

(int

* a)

intmain()

一、傳遞引數

1、值傳遞

test1顯然是乙個值傳遞函式,在用賦值語句呼叫事發生了這樣的事情:

在呼叫的時候,程式在test1棧區域建立了變數a,並將位於主函式棧的a的值賦給位於test1中的a,相當於執行test.a = main.a,這個語句當然是違法的,為了註明兩個變數不同而已,顯然這四個變數的實體地址都完全不同,這就是值傳遞的概念。

再次強調關於變數和位址的關係1

2、引用傳遞

test2是乙個引用傳遞函式,在用賦值語句呼叫事發生了這樣的事情:

在呼叫的時候,在test2棧中建立了int&型別的a變數,並且相當於執行&a = a。

(說到這裡我總算理解了為什麼有時候可以int &a = other,有時候又可以寫int& a = other了,前者的表意為a為other的引用,後者的表意為建立了乙個int&型別的變數a,並將其初始化)

將test2中的a變數作為main中a的引用,現在在符號表中,這兩個變數雖然是兩個變數,但是對應的位址完全一致,任何對乙個位址中值的操作都導致了另外乙個值的改變,這是容易理解的,還是那句話,變數名不存在,只有位址是實在的。

3、指標傳遞

指標傳遞和引用傳遞的功能差別不是特別大,都能夠實現改變傳入引數的功能,但是機制卻不是太一樣,發生了這樣的事情:

在呼叫的時候,程式在test1棧區域建立了指標變數a,並將位於主函式棧的a的位址賦給位於test3的指標,相當於執行了int* a = &a,之後可以通過指標訪問主函式中a變數的那塊空間。

一、返回值

1、返回值

函式test1是乙個返回值的函式,在return的時候,發生了這樣的事情:

變數a的值被複製到暫存器中,相當於建立了乙個臨時變數,並被付給了a的值,但是這個臨時變數是對任何人不可見的,因為區別於傳統意義的變數,它並不存在於記憶體當中,而是暫存器,體現了其臨時的特點。

之後暫存器中的值被在主函式中被賦值給i,遊戲結束。

2、返回引用

函式test2時乙個返回引用的函式,在return時發生了這樣的事情:

其實與其說返回引用,不如說返回了乙個int&型別的變數,這樣更加的便於理解,返回引用型別時,沒有複製返回值,而是返回物件本身,相當於執行表示式:

int& 臨時變數 = n;

j = 臨時變數,這個臨時變數是引用型別,其引用物件就是n。

其實返回引用完全可以像下面的返回指標一樣,按照返回值理解,然後只是只是進行了位址的複製而已。

3、返回指標

函式test3時乙個返回指標的函式,在return時發生了這樣的事情:

a的值,也就是指標a所儲存的位址,被複製到暫存器中,這個值的型別是int*,然後在主函式中被賦給k,k接受到的是位址。這個過程來看,如果把int理解成乙個特殊的資料型別,相對於int只是可以使用操作符,模擬於test1的過程來說顯得幾乎一樣,顯然就更好理解了。

(上面這一小段文字是我本人的想象,我之後再去找一找有沒有具體的機制)

值得注意的是函式指標和指標函式有區別,還很大,注意二者的區別。

int*f

(int a,

int b)

int(

*f)(

int,

int)

;

函式指標與指標函式.

變數名是給編譯器看的,編譯器根據變數是區域性還是全域性分配記憶體位址或棧空間,所謂的變數名在記憶體中不存在,操作時轉換成位址數存放在暫存器中了。

編譯器會將合法的變數名放到乙個叫「符號表」的乙個表中。

每個符號對應乙個位址。當你呼叫此變數時,就會根據此符號表找到對應的位址,然後進行操作。 ↩︎

C 函式引數傳遞方式

引數傳遞有三種方式 值傳遞 pass by value 指標傳遞 pass by pointer 引用傳遞 pass by reference 程式測試 include stdafx.h include using namespace std 值傳遞 pass by value void fun1 ...

引數傳遞以及返回值

在呼叫乙個方法時,我們經常傳入我們需要的引數,對於基本型別的傳入,在執行方法時直接用即可,這裡僅介紹幾種引用型別的引數傳遞 類名作為形式引數 如果乙個方法的形參要乙個類 型別,就傳入乙個該類的物件 根據 可知,建立物件時完成初始化,此時物件裡的的num時2,在呼叫方法時,傳入30,替代了原來的2,所...

c 函式引數的傳遞方式

2.引用作為函式引數傳遞 3 總結 4 參考文獻 值傳遞 單向傳遞 實參傳遞給形參 而形參的值無法傳遞給實參 int max int a,int b int swap int a,int b int main 該程式求最大值結果沒問題,但交換兩數有問題。形參 函式定義處 為普通形式 實參 函式呼叫處...