說來慚愧,寫了好幾年的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