【问题标题】:Why is this C function not doing anything?为什么这个 C 函数什么都不做?
【发布时间】:2015-03-31 03:40:06
【问题描述】:

我有这个功能:

void change(int **x, int **y){
    x = y;
}

int main(void){

    int x = 10 , y = 15;
    int *p = &x;
    int *q = &y;

    change(&p, &q);

    printf("%d %d", x, y);

    return 0;

}

它仍然输出相同的值。 为什么y没有分配到x上?

【问题讨论】:

  • 您发送的是 p 和 q 的地址,而不是 x 和 y。改用void change(int *x, int *y)*x = *y 而不是x = y
  • 您好,感谢您的回复,但我只是想问一下.. 我知道我正在传递地址,但该地址也指向一些有价值的地址...该值是否应该与指针?
  • 您必须取消对指针的引用才能获得该值。
  • 你可以保留你的代码并将x = y更改为**x = **y如果你喜欢
  • @NoobProgrammer 您找到问题的答案了吗?如果是这样,您应该考虑将最适合您的答案标记为已接受。

标签: c function output


【解决方案1】:

C 函数的参数总是按值传递。为了启用按引用传递的行为,可以按值传递指针。然后可以取消引用这些指针以访问函数外部的值。

void change(int **x, int **y){
  x = y;
}

在这里,您将y 的值分配给x,虽然有效但可能不是您想要的:您希望指向 的值发生变化,而不是它的本地副本.一级间接也足够了。因此将其更改为:

void change(int *x, int *y){
  *x = *y;
}

这样使用:

int a = 2, b = 3;
change(&a, &b);

虽然这行得通,但它仍然不是最理想的。我们只是更改x 指向的值。 y 指向的值原封不动地传递。所以我们可以保存该间接并按值传递 y:

void change(int *x, int y){
  *x = y;
}

使用哪个,希望您现在可以猜到,如下所示:

int a = 3, b = 4;
change(&a, b);

【讨论】:

  • 不需要对y 的间接访问。还展示了如何调用change
  • @chqrlie 我以为他想最终将其扩展为 swap 函数。但你是对的,我应该详细说明。
  • 您好,感谢您的快速回复,我听说过很多关于通过引用和值传递的信息。我在谷歌上搜索了很多次,但仍然不明白。。什么时候通过引用传递真的有用?因为 C 无论如何都是按值传递的,为什么允许使用此功能并且不会给您错误?
  • @NoobProgrammer 这是它的一个使用示例,如果没有通过引用,您将无法从函数内部更改函数外部的值。它还可以避免您在函数需要时复制数据。有关更多信息,请查看此问题:stackoverflow.com/questions/373419/…
  • 对不起,我只是没有清楚地理解这句话“如果没有通过引用,您无法从函数内部更改函数外部的值。”...
【解决方案2】:

在您的功能中,您只需更改副本。 试试这个

#include <stdio.h>
#include <stdlib.h>
void change(int **x, int **y){
    **x = **y;
}

int main(void){

    int x = 10 , y = 15;
    int *p = &x;
    int *q = &y;

    change(&p, &q);

    printf("%d %d", x, y);

    return 0;

}

【讨论】:

    【解决方案3】:

    假设你有变量 x 存储在位置 2015 和 y 存储在 2016 中。现在这个指针分别存储在位置 2020 和 2021 中。 所以当你调用函数时,改变值是这样的:

    x = 10
    y = 15
    p = 2015
    q = 2016
    int **x OR &p = 2020
    int **y OR &q = 2021
    

    现在你所做的就像 &p = &q,只不过是将 int **x 的值更改为 2021。但位置 2015 和 2016 的值保持不变。

    x = 10
    y = 15
    p = 2015
    q = 2016
    int **x OR &p = 2021
    int **y OR &q = 2021
    

    这与原始xy 的值无关。

    【讨论】:

      【解决方案4】:

      举个例子:

      int x = 10 , y = 15;
      int *p = &x;
      int *q = &y;
      

      假设&amp;x代表内存地址100,&amp;y代表内存地址104。 然后根据您的程序 p 将有 100 和 q 将有 104 指向地址。 请原谅我再做一个假设:) pq 也将拥有它们的一些内存地址。 因此,假设&amp;p代表内存地址200,&amp;q代表内存地址204。

      change(&p, &q);
      
      void change(int **x, int **y){
      x = y;
      }
      

      现在x 将指向&amp;py 将指向&amp;q。 现在使用x=y 将使x 指向y 即xy 都指向204 内存地址,这无论如何都不能改变x(x=10) 和y( y=15) 在以下函数 sn-p 中。

      int main(void){
      
      int x = 10 , y = 15;
      int *p = &x;
      int *q = &y;
      
      change(&p, &q);
      
      printf("%d %d", x, y);
      
      return 0;
      

      }

      【讨论】:

        【解决方案5】:

        int **x, int **y 只是双指针的声明。 现在 x 和 y 将包含指针 p 和 q 的地址。 **x=**y 应该可以工作。

        【讨论】:

        • “双指针”没有意义。 “指向指针的指针”可能就是您要说的。
        猜你喜欢
        • 2017-12-08
        • 1970-01-01
        • 2018-02-11
        • 2012-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多