【问题标题】:pointers with strings in c programmingc语言中带字符串的指针
【发布时间】:2015-08-06 12:33:40
【问题描述】:

在下面的程序中,我期待 printf 语句打印

a = b, b = a

但是,实际上它正在打印

a=a, b=b

当我尝试在函数内打印ab 值时,它给出了a=b,b=a:::I 不明白为什么传递被引用不会影响实际参数。我错过了什么?有人能说明一下吗?

void swap_pointers(char* a, char* b) {
    char* tmp = a;
    a = b;
    b = tmp;
}

int main() {
    char* a = "a";
    char* b = "b";
    swap_pointers(a, b);
    printf("a = %s, b = %s", a, b);
    return 0;
}

【问题讨论】:

标签: c string pointers pass-by-reference


【解决方案1】:

您只是在函数中更改函数参数的值。如果要更改作为参数传递的指针存储的地址,则需要将指针传递给该指针。

void swap_pointers(char** a, char** b) {
    char* tmp = *a;
    *a = *b;
    *b = tmp;
}

那你就这样称呼它

int main() {
    char* a = "a";
    char* b = "b";
    swap_pointers(&a, &b);
    printf("a = %s, b = %s", a, b);
    return 0;
}

这里发生的事情是,在函数中,您将 tmp 设置为 a 处的值,然后将 a 处的值设置为 处的值> b,并使用取消引用运算符“*”将 值在 b 到 tmp。当您传递 int 参数时,您将通过地址运算符“&”传递 地址 a 和 地址 b。因此,在函数中,您将值设置为 (*) 变量的地址 (&)。而那个变量本身就是一个指针。

【讨论】:

    【解决方案2】:

    指针(“按引用传递”的“引用”)是按值传递的。如果要更改引用,则需要通过引用传递 reference(char **a, char **b),并具有可以切换的指针到指针到字符的变量。您的函数将用于交换这些指针的内容;但它不能自己交换指针。

    【讨论】:

      【解决方案3】:
      #include <stdio.h>
      void swap_pointers(char *a, char *b) {
          char tmp = *a;
          *a = *b;
          *b = tmp;
      }
      
      
      
      int main() {
          char a = 'a';
          char b = 'b';
          swap_pointers(&a,&b);
          printf("a = %c, b = %c", a, b);
          return 0;
      }
      

      【讨论】:

      • 首先你改变的是地址而不是分配给它的值
      • 尝试在代码中使用正确的格式,以及一些解释。不推荐只使用代码块。
      【解决方案4】:

      嗯,这是一个非常简单和基本的问题,与函数调用有关。

      当你这样做时swap_pointers(a, b);

      它实际上将ab 的副本传递给函数;

      确实在函数内部进行了交换。

      但是,你在函数内部什么也不做,控制权返回给main

      因此,main 内部没有进行任何更改。

      这就是你正在经历的。您的问题的解决方案是使用按引用调用

      因为,user2864740 在评论中已经提出了建议,Dave 在他的回答中对此进行了解释。

      【讨论】:

        猜你喜欢
        • 2011-03-08
        • 2014-09-29
        • 1970-01-01
        • 2022-09-23
        • 1970-01-01
        • 1970-01-01
        • 2021-07-01
        • 2023-04-01
        • 1970-01-01
        相关资源
        最近更新 更多