在函数调用之间使用带有指向堆栈变量的指针的 Transfer(by-value?) 值

use value of transfer(by-value?) between function calls with pointers to stackvariables

提问人:user2682811 提问时间:11/20/2014 最后编辑:user2682811 更新时间:11/23/2014 访问量:419

问:

“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 的值。但是,我在哪里使用这种指向堆栈变量的指针技术在函数之间传输值。我是否在函数之间传输值?我不这么认为,如果我这样做,我应该将一些东西返回给另一个函数。目前看来,我似乎只是在函数调用之间更新了一个变量?但也许这个问题已经回答了?但是我仍然有点担心在函数调用之间传输值意味着什么。

C 变量指 堆栈 传递

评论


答:

2赞 user3386109 11/20/2014 #1

如果你希望能够改变 中的变量,那么你把一个指向 x 的指针传递到这样的fun2xfun1fun2

// 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 的值。xxfun2xfun1

// 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`
}

评论

0赞 Spikatrix 11/20/2014
OP不知道这些叫什么。在你的回答中提到两种方式
0赞 user3386109 11/20/2014
@CoolGuy 谢谢,做了一些改变。现在看起来还好吗?
0赞 David C. Rankin 11/23/2014 #2

思考或理解正在传递的内容的另一种方式。当您调用 时,您正在将 的副本传递给 。不管你用 in 做什么,outside of 的值都保持不变——因为你只是把 x 的副本传递给了 。pass by valuepass by referencefunction (int x)xfunctionxfunctionxfunctionfunction

另一方面,当您调用 时,您将 的地址对 的引用)传递给 。这就是为什么通常被称为操作员的原因。现在,无论您做什么,都会更改 x 指向的内存。因此,outside of 的值也发生了变化,因为您更改了地址 &x 指向的内存function (int *x)xxfunction&the address ofxfunctionxfunction

下面是一个简短的带注释的函数示例:

#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