值传递
值传递是在函数被调用时,给形参分配存储单元,把实参的值传递给形参,在调用结束后,形参的存储单元被释放。形参只是对实参的一份临时拷贝,形参值的任何变化都不会影响实参的值。
void test(int a) {
a = 2;
std::cout << "形参的值: " << a << std::endl;
std::cout << "形参的地址: " << &a << std::endl;
}
int main() {
int a = 5;
test(a);
std::cout << "实参的值: " << a << std::endl;
std::cout << "实参的地址: " << &a << std::endl;
return 0;
}
形参的值: 2
形参的地址: 0x7ffcf663403c
实参的值: 5
实参的地址: 0x7ffcf6634054
引用传递
对于引用传递,形参相当于是实参的一个“别名‘’,对形参进行操作就是直接在实参上进行操作,能改变实参的值。
void test(int& a) {
a = 2;
std::cout << "形参的值: " << a << std::endl;
std::cout << "形参的地址: " << &a << std::endl;
}
int main() {
int a = 5;
test(a);
std::cout << "实参的值: " << a << std::endl;
std::cout << "实参的地址: " << &a << std::endl;
return 0;
}
形参的值: 2
形参的地址: 0x7ffd493fe684
实参的值: 2
实参的地址: 0x7ffd493fe684
指针传递
如果说引用只是一个别名的话,那么指针就是一个实体。对于指针传递,要求传递指针的值或者数组首地址,形参接收到的是实参的地址,形参和实参指向同一个存储单元。
void test(int* a) {
*a = 2;
std::cout << "形参的值: " << a << std::endl;
std::cout << "实参指向地址的值: " << *a << std::endl;
std::cout << "形参的地址: " << &a << std::endl;
}
int main() {
int a = 5;
int* b = &a;
test(b);
std::cout << "实参的值: " << b << std::endl;
std::cout << "实参指向地址的值: " << *b << std::endl;
std::cout << "实参的地址: " << &b << std::endl;
return 0;
}
形参的值: 0x7ffd4ba4ccec
实参指向地址的值: 2
形参的地址: 0x7ffd4ba4ccc8
实参的值: 0x7ffd4ba4ccec
实参指向地址的值: 2
实参的地址: 0x7ffd4ba4ccf0
总结:引用传递和指针传递是以不同的方式实现相同的效果。
指针本身是一个变量,存储的是一个地址。引用和原来的变量实质上是同一个东西,相当于变量的“别名“。因此,当把指针作为参数传递时,也是将实参的一个拷贝传递给形参,两者指向的地址相同,但不是同一个变量,在调用函数中改变形参指针的指向不会影响实参。