C-按值调用可以更改主程序的值



考虑以下程序:

void f2 ( int * a, int * b) {   
               int c; 
               c = * a;
               *a = *b;
               *b = c; 
} 
int main () { 
        int a = 4, b = 5, c = 6; 
        f2 (&b, &c); 
        printf ("%d", c - a - b);  
 }

在这里,bc的值已交换。

和另一个代码是:

# include <stdio.h>
void mystery (int *ptra, int *ptrb) {  
     int *temp; 
     temp = ptrb;  
     ptrb = ptra; 
     ptra = temp; 
} 
int main () { 
    int a = 2016, b=0, c= 4, d = 42; 
    mystery (&a, &b);
    if (a < c) 
          mystery (&c, &a); 
    mystery (&a, &d); 
    printf("%dn", a); 
}

在这里,尽管存在相同类型的函数调用,但是main()程序中任何变量的值都不会更改。

我们知道,C代码中没有参考。因此,我的问题是,尽管两个程序中都有相同类型的函数调用,但为什么一个人交换变量值而另一个人不能交换?

在第二个程序中,指针交换意味着地址也是交换。正确的??但这不会影响价值。在第1个程序中,地址和指针被交换,并且在平均时间值时值也交换了。但是为什么??

我也想知道,在逐个值的情况下,可以更改main(或不带有返回功能(的值

在第二个程序中,指针是交换意味着地址也是 交换。正确的??但这不会影响价值。在第一个程序中 ,地址和指针被互换,并在同一时间值中值 交换。但是为什么??

因为

void mystery (int *ptra, int *ptrb) {  
     int *temp; 
     temp = ptrb;  
     ptrb =ptra; 
     ptra = temp; 
}

上面的程序交换了ptraptrb的内容,而不是ptraptrb指向的对象的内容,因为ptraptrbmystery函数本地的。


要以图像表示。

考虑ab存储在地址100200

mystery (&a, &b);呼叫。

ptra将通过将100存储到其中指向a。和ptrb将通过将200存储到其中。

,指向b
     ptra       100
   +-----+     +---+
   | 100 |     | 1 | 
   +-----+     +---+
     ptrb       200
   +-----+     +---+
   |200  |     | 2 | 
   +-----+     +---+

功能完成执行时。

ptra将通过将200存储到其中指向bptrb将通过将100存储到其中指向a

    ptra        100
   +-----+     +---+
   | 200 |     | 1 | 
   +-----+     +---+
    ptrb        200
   +-----+     +---+
   |100  |     | 2 | 
   +-----+     +---+

在第一个程序中的f2中,指针是 rederected 更改这些指示器指向的内容,以便修改了main函数中的bc。相反,第二个程序中的mystery仅交换本地变量ptraptrb的值,该变量对main中的变量没有影响。

所以:

ptrb = ptra; 

分配了一个指针到另一个指针的值(这两者都是 msytery本地的(,而这是:

*a = *b;

将一个指针指向的值的值更改为另一个指针指向的值,即ab中的CC_38。

另一种考虑这一点的方式是与房屋及其居民一起:

    ______        _____         ______       ______
   /______      /______      /______     /______
 2 |Smith |    4 |Jones |    6 | Bond |   8 | Solo |
   --------      --------      --------     --------

第一个程序是说"交换两个房屋的居民":

    ______        _____         ______       ______
   /______      /______      /______     /______
 2 |Smith |    4 | Bond |    6 |Jones |   8 | Solo |
   --------      --------      --------     --------

第二个说"交换房屋上的数字"时:

    ______        _____         ______       ______
   /______      /______      /______     /______
 2 |Smith |    6 |Jones |    4 | Bond |   8 | Solo |
   --------      --------      --------     --------

在第一个片段中,您更改了此函数范围中不局部的对象的值 - 在主机中定义并由这些指针引用。

在第二个中,您会更改局部变量,该变量在离开功能时停止存在。

相关内容

  • 没有找到相关文章

最新更新