按引用调用和按值调用之间的区别

swa*_*dip 8 c c++

可能重复:
值参数和参考参数之间的差异?

通过引用调用和按值调用之间有什么区别?

Jer*_*fin 11

在C中,没有通过引用的调用.你可以得到的最接近的地方是获取一个地址,并传递该地址的副本(按价值 - 见下文).

在C++中,通过引用调用传递对象的引用(原始对象的别名).通常,这将作为对象的地址实现,但不能保证.

按值调用意味着获取某种值,并将该值的副本传递给该函数.

基本区别在于,当您按值传递参数时,该函数仅接收原始对象的副本,因此它无法执行任何操作来影响原始对象.通过引用传递,它获取对原始对象的引用,因此它可以访问原始对象,而不是它的副本 - 除非它是const引用,它可以修改原始对象(例如).


Vin*_*dey 1

传递给函数的参数可以有两种类型,即\n 1. 传递的值\n 2. 传递的地址

\n\n

第一种类型是指按值调用,第二种类型是指按引用调用。\n例如,考虑program1

\n\n
    main()\n    {\n        int x=50, y=70;\n        interchange(x,y);\n        printf(\xe2\x80\x9cx=%d y=%d\xe2\x80\x9d,x,y);\n    }\n\n    interchange(x1,y1)\n    int x1,y1;\n    {\n        int z1;\n        z1=x1;\n        x1=y1;\n        y1=z1;\n        printf(\xe2\x80\x9cx1=%d y1=%d\xe2\x80\x9d,x1,y1);\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

这里函数交换的值是按值传递的。

\n\n

考虑方案2

\n\n
main()\n{\n    int x=50, y=70;\n    interchange(&x,&y);\n    printf(\xe2\x80\x9cx=%d y=%d\xe2\x80\x9d,x,y);\n}\n\ninterchange(x1,y1)\nint *x1,*y1;\n{\n    int z1;\n    z1=*x1;\n    *x1=*y1;\n    *y1=z1;\n    printf(\xe2\x80\x9c*x=%d *y=%d\xe2\x80\x9d,x1,y1);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这里通过引用调用该函数。换句话说,地址是通过使用符号&来传递的,而值是通过使用符号*来访问的。

\n\n

通过分析program1和program2的输出可以看出它们之间的主要区别。

\n\n

按值调用的program1的输出是

\n\n
x1=70 y1=50\nx=50 y=70\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是通过引用调用的program2的输出是

\n\n
*x=70 *y=50\nx=70 y=50\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是因为在按值调用的情况下,该值被传递给名为交换的函数,并且该值被交换并打印为

\n\n
x1=70 y1=50\n
Run Code Online (Sandbox Code Playgroud)\n\n

再次由于没有返回任何值,因此 x 和 y 的原始值与 main 函数中一样

\n\n
x=50 y=70 got printed.\n
Run Code Online (Sandbox Code Playgroud)\n

  • 我不知道还有人用 K&R C 编程。:-) (4认同)
  • 哇,K&R 风格的参数传递:) (2认同)