-4

考虑以下程序:

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);  
 }

这里 和 的值b正在c交换。

另一个代码是:

# 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("%d\n", a); 
}

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

众所周知,C 代码中没有引用调用。所以,我的问题是,虽然两个程序中都有相同类型的函数调用,那么为什么一个交换变量的值而另一个不能交换?

在第二个程序中,指针正在交换意味着地址也在交换。对??但不影响价值。在第一个程序中,地址和指针被交换,同时值也被交换。但为什么??

我也想知道,在哪里按值调用,可以改变main()程序的值(有或没有返回函数)??

4

3 回答 3

2

在第二个程序中,指针正在交换意味着地址也在交换。对??但不影响价值。在第一个程序中,地址和指针被交换,同时值也被交换。但为什么??

因为

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

上面的程序交换和指向的对象的内容,ptraptrb不是它们的内容,因为和是本地函数。ptraptrbptraptrbmystery


形象地表现它。

考虑ab存储在地址100200

通话后 mystery (&a, &b);

ptraa将通过存储100到其中来指向。并将通过存储ptrb指向它。b200

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

当函数完成执行时。

ptrab将通过存储200到其中来指向。并将通过存储ptrb指向它。a100

    ptra        100
   +-----+     +---+
   | 200 |     | 1 | 
   +-----+     +---+
    ptrb        200
   +-----+     +---+
   |100  |     | 2 | 
   +-----+     +---+
于 2019-07-05T15:51:20.423 回答
1

f2第一个程序中,指针被取消引用以更改这些指针指向的内容,以便修改函数中的b内容cmain相反,mystery在第二个程序中只是交换局部变量的值,ptraptrbmain.

所以这:

ptrb = ptra; 

将一个指针的值分配给另一个(它们都是本地的msytery),而这个:

*a = *b;

将一个指针指向的值更改为另一个指针指向的值abin main

另一种思考方式是房屋及其居民:

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

第一个程序是说“交换两所房子的居民”:

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

第二个是说“交换房屋上的数字”:

    ______        _____         ______       ______
   /______\      /______\      /______\     /______\
 2 |Smith |    6 |Jones |    4 | Bond |   8 | Solo |
   --------      --------      --------     --------
于 2019-07-05T16:59:30.027 回答
0

在第一个片段中,您更改了在此函数范围内非本地对象的值 - 在 main 中定义并由这些指针引用。

在第二个中,您更改离开函数时停止存在的局部变量。

于 2019-07-05T16:01:34.543 回答