天天看點

值傳遞、指針傳遞、引用傳遞

說來慚愧,寫了好幾年的c/c++,雖然在指針和位址 以及 值傳遞、指針傳遞、引用傳遞 不會用錯,但是在描述上确是模棱兩可的狀态,今天參照《C++ Primer》決定做一個歸納總結,讓自己有更清晰的了解,不足之處,大家多多批判。

一:值傳遞

方法調用時,實際參數把它的值傳遞給對應的形式參數(建立一個參數副本),方法執行中形式參數值的改變不影響實際參數的值(因為形參是副本,不會影響到實參)

void  func(int b)
{
	printf("b1 = %d\n", b);
	b = 374;
	printf("b2 = %d\n", b);
}

int main(int argc, char* argv[])
{
	int a = 1;
	printf("a1 = %d\n", a);
	func(a);
	printf("a1 = %d\n", a);
	return 0;
}
           

運作結果:

a1 = 1
b1 = 1
b2 = 374
a1 = 1
           

二:指針傳遞

傳遞的是一個外部實參的位址,當被調用函數的形參發生變化時,實參也會變化;

void func(int *b)
{
	printf("b add = %p, %d\n", b, *b);
	*b  = 38;
}

int main(int argc, char* argv[])
{
	int a = 1;
	
	printf("a add = %p, %d\n", &a, a);
	func(&a);
	printf("->a add = %p, %d\n", &a, a);
	return 0;
}
           

運作結果:

a add = 0x7ffd9f72d0fc, 1
b add = 0x7ffd9f72d0fc, 1
->a add = 0x7ffd9f72d0fc, 38
           

三:引用傳遞

引用(reference)是為對象起了另外一個名字,如下面的這個例子變量val和refval的記憶體位址是相同的(refval指向val),通過别名(refval)原先的變量(val)也會被修改。

#include <stdio.h>
int main(int argc, char* argv[])
{
	int val = 1024;
	int &refval = val;        //refval指向val(是val的另一個名字)
	//int &refval2;             //報錯,引用必須被初始化
	
	printf(" val add = %p\n", &val);
	printf(" refval add = %p, %d\n", &refval, refval);

	refval = 2;

	printf(" ------------ \n");
	printf(" val add = %p\n", &val);
	printf(" refval add = %p, %d\n", &refval, refval);

}
           

運作結果:

val add = 0x7ffe6748c364
 refval add = 0x7ffe6748c364, 1024
 ------------ 
 val add = 0x7ffe6748c364
 refval add = 0x7ffe6748c364, 2
           

另一個例子,函數中的引用傳遞:

void test_ref_func(int &refval)
{
	printf("on test_ref_func val add =%p, %d\n", &refval, refval);
	refval = 352;
}

int main(int argc, char* argv[])
{
	int val = 1;
	
	printf("before test_ref_func aaa add = %p, %d\n", &val, val);
	test_ref_func(val);
	printf("after test_ref_func aaa add = %p, %d\n", &val, val);
	return 0;
}
           

運作結果:

before test_ref_func aaa add = 0x7ffc1110c7fc, 1
on test_ref_func val add =0x7ffc1110c7fc, 1
after test_ref_func aaa add = 0x7ffc1110c7fc, 352
           

繼續閱讀