提问人:user2682811 提问时间:11/20/2014 最后编辑:user2682811 更新时间:11/23/2014 访问量:419
在函数调用之间使用带有指向堆栈变量的指针的 Transfer(by-value?) 值
use value of transfer(by-value?) between function calls with pointers to stackvariables
问:
“value of transfer”(by-value?不是百分百确定英文术语)之间的函数调用。举个例子,假设我使用指向堆栈变量的指针。
我真的不明白“转移价值”的概念。函数应该返回给另一个函数什么?
如果我使用如下例中的指针,我只是转移指针地址?那么,如何使用带有指向堆栈变量的指针的 transfer 值呢?
void fun1(){
int x = 44;
int *y = &x;
}
void fun2(){
int *y;
}
从第一个答案:
void fun1(){
int x = 44;
fun2( &x );
printf( "%d\n", x ); // prints 55
}
void fun2( int *value ){
printf( "%d\n", *value ); // prints 44
*value = 55; // changes the value of `x` in `fun1`
}
对我来说,似乎我只是将指向堆栈变量 (x) 的指针转移到 fun2?因此,实际问题是:如何使用指针堆叠变量以在函数调用之间传输值?
你可能已经回答了这个问题?但是我想确定这一点,如果我做对了,那么到目前为止我的想法是这样的:我首先发送一个指向从 fun1 到 fun2 的堆栈变量 x 的指针。当调用 fun2 时,我将 int x = 44 的值通过 *value = 55 更新为 55,并且 *value 是指向堆栈变量的指针,因此我实际上借助指向堆栈变量的指针更新了变量 x 的值。但是,我在哪里使用这种指向堆栈变量的指针技术在函数之间传输值。我是否在函数之间传输值?我不这么认为,如果我这样做,我应该将一些东西返回给另一个函数。目前看来,我似乎只是在函数调用之间更新了一个变量?但也许这个问题已经回答了?但是我仍然有点担心在函数调用之间传输值意味着什么。
答:
如果你希望能够改变 中的变量,那么你把一个指向 x 的指针传递到这样的fun2
x
fun1
fun2
// This code demonstrates "pass by address" which (for the C programming
// language) is the same as "pass by reference".
void fun1(){
int x = 44;
fun2( &x );
printf( "%d\n", x ); // prints 55
}
void fun2( int *value ){
printf( "%d\n", *value ); // prints 44
*value = 55; // changes the value of `x` in `fun1`
}
如果作为参数而不是 的地址传递,则无法更改 has 的值。x
x
fun2
x
fun1
// This code demonstrates "pass by value". fun2 is given the value of x but
// has no way to change fun1's copy of x.
void fun1( void ){
int x = 44;
fun2( x );
printf( "%d\n", x ); // prints 44
}
void fun2( int value ){
printf( "%d\n", value ); // prints 44
value = 55; // has no effect on `x` in `fun1`
}
评论
思考或理解正在传递的内容的另一种方式。当您调用 时,您正在将 的副本传递给 。不管你用 in 做什么,outside of 的值都保持不变——因为你只是把 x
的副本传递给了 。pass by value
pass by reference
function (int x)
x
function
x
function
x
function
function
另一方面,当您调用 时,您将 的地址(对 的引用)传递给 。这就是为什么通常被称为操作员的原因。现在,无论您做什么,都会更改 x
指向的内存。因此,outside of 的值也发生了变化,因为您更改了地址 &x
指向的内存。function (int *x)
x
x
function
&
the address of
x
function
x
function
下面是一个简短的带注释的函数示例:
#include <stdio.h>
/* value is copy of variable 'x' holding its value */
void fun2_by_value ( int value )
{
printf( "%-17s - %d\n", __func__, value ); /* prints 44 */
value = 55; /* values is a copy of x from fun1_by_value */
}
void fun1_by_value ()
{
int x = 44;
fun2_by_value (x); /* passes copy of 'x's value */
printf ( "%-17s - %d\n", __func__, x ); /* prints 44 */
}
/* value is pointer to memory containing 'x' */
void fun2_by_reference ( int *value )
{
printf ( "%-17s - %d\n", __func__, *value ); /* prints 44 */
*value = 55; /* changes mem pointed to by address 'value' */
}
void fun1_by_reference ()
{
int x = 44;
fun2_by_reference (&x); /* passes address of 'x' */
printf ( "%-17s - %d\n", __func__, x ); /* prints 55 */
}
int main () {
printf ("\nCalling 'fun1_by_value ();'\n\n");
fun1_by_value ();
printf ("\nCalling 'fun1_by_reference ();'\n\n");
fun1_by_reference ();
printf ("\n");
return 0;
}
输出:
$ ./bin/byrbyv
Calling 'fun1_by_value ();'
fun2_by_value - 44
fun1_by_value - 44
Calling 'fun1_by_reference ();'
fun2_by_reference - 44
fun1_by_reference - 55
评论