傳址引用
1. C語言 傳值 傳址 傳引用
我來詳細解釋一下: void test1(int a)
{
a = 100; //這里的a是根據參數a而構造出的一個副本,暫存於棧中,與實際參數a完全處於不同內存。
//當函數退出時,a自動無效,修改a的值只是修改棧中這個a的值,無法修改實參。
//如果使用的是C++傳遞的是一個類的話,同樣需要構造一個副本,函數退出時也會析構
//該副本,因此會加大構造和析構的開銷,同時會加大內存開銷用於保存臨時副本
}void test2(int* a)
{
*a = 1000; //這里的a和傳值一樣,也是構造的一個副本,不過這個副本是一個指針,同樣暫存域棧中
//同樣需要加大創建這個指針副本的內存,32位機器為4位元組,即存放這個副本用的
//同樣與實參a指針處於完全不同的內存
//但是,雖然這兩個指針處於不同內存,他們指向的地址卻是同一個地址
//我們通過*操作符來解析指針指向的地址的值(簡稱解引用)
//*a = 5;這句代碼的意思是將副本a指向的地址的值改變為5
//由於副本a指向的地址與實參指向的地址相同,即改變了實參指向的地址的值
//因此實參a指向的地址的值變成了5 //可以解釋的形象一些,
//假如實參a自身處於內存0x01,它指向地址0x03
//那麼這個副本處於的內存不會是0x01(因為它是構造出來的一個副本指針),我們假設它自身地址
//為0x02(只是假設,這個地址值肯定是在棧當中的),而它指向的地址一樣是0x03
}void test3(int* a)
{
int tmp;
a = &tmp; //接著test2講,由於這里的a是一個構造的副本,如果我們改變它,讓它指向tmp的地址
//就不會改變實參指向的地址的值,這里只是將副本指向的地址改變了而已 //解釋的形象一些,
//同理假設實參a自身內存為0x01,它指向地址0x03
//這里的a的自身內存為0x02,它也指向地址0x03
//tmp地址為0x04
//a = &tmp;這句代碼的意思是讓a指向tmp的地址,即副本a指向了tmp地址0x04
//而實參a指向的地址的值沒有發生任何變化
*a = 10000; //這里對形參a的任何操作已經於實參a毫無任何關系了
//因為它自身地址是0x02,它指向的地址是0x04
}void test4(int& a)
{
a = 100000; //這里的a與實參a完全一樣了,在這里對a的任何操作等價於對實參a的操作
}
void main()
{
int a = 1;
int b = 2;
int c = 3;
int d = 4; printf("操作前各值\na:%d\tb:%d\tc:%d\td:%d\n", a, b, c, d); test1(a);
test2(&b);
test3(&c);
test4(d); printf("操作後各值\na:%d\tb:%d\tc:%d\td:%d\n", a, b, c, d);
} 附圖:
2. 什麼是傳值,什麼是傳址(引用)對此,C/C++與Java中的函數(方法)有什麼不同
傳值就是把某個數值、字元串或類對象復制一份,作為參數
傳址是把某個數值、字元串或類對象的地址作為參數,沒有復制過程,所以當參數位類對象、或字元串時,效率比傳值要高。
c++沒有誕生前,傳址是用指針實現的,但指針容易出錯,所以Bjarne們發明了引用,其實質還是指針。
我的理解,在這個問題上,c++和java沒有區別。
3. 什麼叫做傳址調用
傳址調用
#include<stdio.h>
void swap(int *x,int *y)
{
int temp;
temp=*x;
*x=*y;
*y=temp;
}
int main()
{
int a=1,b=2;
printf("a=%d,b=%d\n",a,b);
swap(&a,&b);
return 0;
}