【问题标题】:Pass By Reference Using C使用 C 通过引用传递
【发布时间】:2012-01-27 19:30:42
【问题描述】:

我知道当您通过 C 中的函数通过引用传递时,函数的参数采用将被修改的指针的地址。我对为什么这个引用传递的例子不起作用感到非常困惑。谁能指出我正确的方向....

这应该输出一个交换,但是当我编译时交换没有发生,为什么这个通过引用传递不起作用?

#include <stdio.h>

void swapnum(int *i, int *j) {
    int temp = i;
    i = j;
    j = temp;
}   

int main(void) {
   int a = 10;
   int b = 20;

   swapnum(&a, &b);
   printf("A is %d and B is %d\n", a, b);
   getchar();
   getchar();

 return 0;
}

【问题讨论】:

  • 如果您使用的是相当现代的编译器,您应该收到关于int temp = i; 的警告。注意那些......他们可以,但你在正确的轨道上。
  • 感谢大家的快速响应!每个人都非常有帮助,在阅读了每个人都写的内容后,我确实明白现在的问题是什么。我的编译器确实警告过我,尽管我认为我可以将指针的地址存储到 int 数据类型中。我猜这是不正确的。
  • 我们在 C 中称它们为指针,但在许多其他语言中也有称为引用的东西。
  • 所以在 swapnum() 函数的第 4 行... i=j,让我正确理解这一点,这是有效的代码行吗?如果我是正确的,它的作用是获取 j 的地址并将其存储到 i 中。所以在我的脑海中,我指向 j。这是正确的思考方式吗,如果这是为什么这只是局部的,而没有反映在主要的变化??

标签: c pointers pass-by-reference swap


【解决方案1】:

您忘记在函数内取消引用指针。因此,您最终会重新分配本地指针值,而不是更改所指向的实际值,并且它没有任何效果。

所以,使用* 取消引用运算符:

int temp = *i;
*i = *j;
*j = temp;

【讨论】:

  • @Fred - 请注意,如果您启用了编译器警告,他们会选择这个,因为您将 int* i(指针)分配给 int temp(不是指针)。始终致力于在启用警告的情况下进行编译,这样可以避免无穷无尽的问题(gcc 上的-Wall -Werror)。
【解决方案2】:

我想知道为什么您没有收到任何编译器警告/错误。您需要在函数中取消引用您的引用:

void swapnum(int *i, int *j) {
    int temp = *i;
    *i = *j;
    *j = temp;
} 

原因是ij里面的swapnum()是函数调用时原始变量的地址。所以当你只使用ij 时,你得到的是变量的地址,而不是内容。以下是正在发生的事情的一个想法:

int a = 10;
int b = 20;

        -----------------
0x1000  |  10           |             <-- a
        -----------------
        -----------------
0x1004  |  20           |             <-- b
        -----------------

swapnum(&a, &b);

那么,在swapnum(int *i, int *j)里面:

        -----------------
0x2000  |  0x1000       |             <-- i (*i == 10)
        -----------------
        -----------------
0x2004  |  0x1004       |             <-- j (*j == 20)
        -----------------

【讨论】:

  • 非常感谢您的详细解释,这有助于可视化正在发生的事情。
【解决方案3】:

swapnum 函数中,您只需分配变量ij,它们是该函数的本地变量。这不会在此功能之外产生任何影响。你应该试试:

void swapnum(int *i, int *j) {
    int temp = *i;
    *i = *j;
    *j = temp;
}

【讨论】:

    【解决方案4】:

    它(希望)崩溃了,因为在这个函数中:

    void swapnum(int *i, int *j) {
        int temp = i;
        i = j;
        j = temp;
    }
    

    ij 是指针,temp 是一个 int。您不能将指针分配给 int。如果您想交换 ij 中的值,请执行以下操作:

    void swapnum(int *i, int *j) {
        int temp = *i;
        *i = *j;
        *j = temp;
    }
    

    【讨论】:

      【解决方案5】:

      你想要:

      void swapnum(int *i, int *j) {
          int temp = *i;
          *i = *j;
          *j = temp;
      

      【讨论】:

        【解决方案6】:

        swapnum 中,您正在交换指针(它们也是 int 值)。试试这个:

        void swapnum(int *i, int *j) {
            int temp = *i;
            *i = *j;
            *j = temp;
        }
        

        【讨论】:

        • 指针不完全是ints(在 89 标准之前很长时间的不同类型),但如果大小兼容,编译器将执行分配。大多数人也会对此发出警告。
        【解决方案7】:

        您对 swapnum() 的实现有点不当。该函数采用 2 (int *) 参数。即 i 和 j 是整数指针,存储 a 和 b 的引用。当你做 int temp = i;您实际上是在分配一个指向整数变量的指针(这是不正确的),然后不是交换值,而是代码 sn-p 玩弄地址。这就是你需要的

        void swapnum(int *i, int *j) {
            int temp = *i;
            *i = *j;
            *j = temp;
        }
        

        【讨论】:

          猜你喜欢
          • 2011-01-17
          • 2020-04-01
          • 2012-05-13
          • 2014-03-10
          • 2012-06-14
          • 2014-05-05
          • 1970-01-01
          • 2018-09-01
          • 2020-12-06
          相关资源
          最近更新 更多