【c++】值传递、引用传递和指针传递

值传递

值传递是在函数被调用时,给形参分配存储单元,把实参的值传递给形参,在调用结束后,形参的存储单元被释放。形参只是对实参的一份临时拷贝,形参值的任何变化都不会影响实参的值。

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

总结:引用传递和指针传递是以不同的方式实现相同的效果。

指针本身是一个变量,存储的是一个地址。引用和原来的变量实质上是同一个东西,相当于变量的“别名“。因此,当把指针作为参数传递时,也是将实参的一个拷贝传递给形参,两者指向的地址相同,但不是同一个变量,在调用函数中改变形参指针的指向不会影响实参。

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值