C 傳值與傳位址

2021-08-23 12:42:50 字數 1466 閱讀 3848

#include

struct

object

;//傳值方式

void text1(object a)

//傳位址方式

void text2(object* a)

int main()

; text1(obj);

text2(&obj);

return

0;}

1.傳值方式

函式的形參是傳入的實參的乙份拷貝,形參是函式的區域性變數,只在函式內部有效。

在函式text1被呼叫時,有兩個object物件,其中乙個叫obj,定義在main函式裡,另乙個叫a,是函式test1裡的區域性變數。

在傳值呼叫時,講obj的值賦給了變數a.相當於:

object a = obj;

因此說,物件a是obj的乙個拷貝,下面分析這一部操作的資源消耗:

(1)從記憶體資源消耗上看(空間角度),物件a耗費260個位元組的記憶體。

(2)從cpu資源的耗費上看(時間角度),從物件obj到物件a需要複製260個位元組。

2.傳位址方式
在函式text2被呼叫時,傳入乙個物件obj的位址,既有乙個object*指標來表示物件obj的位址

object *p = &obj;

下面分析這一部操作的資源消耗:

(1)從記憶體資源消耗上看(空間角度),指標p佔據4個位元組,所有的指標其實只是乙個整數(表示記憶體位址)

(2)從cpu資源的耗費上看(時間角度),不需要複製資料,只需傳遞乙個整數字址。

通過比較發現,傳位址方式在效能上遠遠優於傳值方式,它使用了較少的資源完成了相同的事情。在記憶體上,傳位址方式使用了較少的記憶體,在cpu消耗上,傳位址方式耗費的cpu操作也非常少。

所以在c/c++裡,當乙個物件的體積較大時(結構體。陣列),總是使用傳位址方式來傳遞引數

. cpu的位是指一次性可處理的資料量是多少,1位元組=8位,32位處理器可以一次性處理4個位元組的資料量,依次類推。32位作業系統針對的32位的cpu設計。64位作業系統針對的64位的cpu設計。作業系統只是硬體和應用軟體中間的乙個平台。我們的cpu從原來的8位,16位,到現在的32位和64位。

# include

int main(void)

執行結果是 4 4 4

指標不同於一般變數,存的是變數的位址,在同一架構下位址長度都是相同的(cpu的最大定址記憶體空間),所以不同型別的指標長度都一樣,輸出的4 4 4,說明指標長度為4位元組,可以記錄的位址範圍是0x00000000~0xffffffff,這個範圍才是指標變數的值。比如說乙個char 1位元組,可以存在0x0,也可以位於0xffffffff,而和char占用1位元組還是100位元組無關,*指標的範圍只和機器字和系統有關比如你的32位系統,指標長度為4,在64位作業系統下那麼就都是8了。

傳值與傳位址

傳遞數值 include exchange numbers void exchange number int inum 1,int inum 2 int main int argc,const char argv 數值並不會交換!由於自定義函式中只是交換了inmu1和inum2對應儲存空間中的數值。...

C 傳值和傳位址

1 交換變數x和y的值 void swap int x,int y int temp temp x x y y temp cout int a 5 int b 10 int x 1 int y 2 void swap int x,int y int a 5 int b 10 int x a int ...

傳值 傳引用 傳位址

1.值傳遞 形參是實參的拷貝,改變形參的值並不會影響外部實參的值。從被呼叫函式的角度來說,值傳遞是單向的 實參 形參 引數的值只能傳入,不能傳出。當函式內部需要修改引數,並且不希望這個改變影響呼叫者時,採用值傳遞。void swap int a,int b 呼叫 int x,y swap x,y 實...