【问题标题】:Quesion regarding pointers in C [duplicate]关于C中指针的问题[重复]
【发布时间】:2021-08-13 16:01:40
【问题描述】:
void fun1(char *s1, char *s2) {
     char *temp;
     temp = s1;
     s1 = s2;
     s2 = temp;
}

int main () {
     char *str1 = "Hello", *str2 = "there!"
     fun1(str1, str2);
     printf("%s %s", str1, str2);
     return 0;
}

鉴于上面的代码,据我了解,我们按值传递指针,所以如果值是 str1 = 1000,str2 = 2000,fun1 会切换它们,所以 str1 = 2000,str2 = 1000。 所以当我们试图打印它们时,我们应该得到“那里!你好”,但答案说它打印“你好!”而且我不明白为什么..通过在str1的值周围切换它们应该是“那里!”的第一个字符的内存地址!和 "Hello" 的第一个字符的 str2 .. 我觉得我错过了一些重要的东西..

【问题讨论】:

  • 你的函数fun1 正在交换它的指针副本。它不交换指向的数据,也不对调用者中的str1str2 指针做任何事情。
  • “据我了解,我们按值传递指针”-您在第一句话中回答了自己的问题。
  • 函数中的变量与main中的变量不一样
  • 所以每当我们通过值传递时,我们都会创建传递下来的争论的副本?也就是说,新副本在内存中有自己的位置,并且曾经与原始变量没有任何联系?
  • 这是对pass-by-value的一个很好的定义。

标签: c string pointers


【解决方案1】:

指针按值传递,所以s1s2的值切换不会影响str1str2

如果您希望函数修改调用者指定的内容,您应该将指针传递给应该修改的内容,如下所示:

#include <stdio.h>

void fun1(char **s1, char **s2) {
     char *temp;
     temp = *s1;
     *s1 = *s2;
     *s2 = temp;
}

int main (void) {
     char *str1 = "Hello", *str2 = "there!"
     fun1(&str1, &str2);
     printf("%s %s", str1, str2);
     return 0;
}

【讨论】:

    猜你喜欢
    • 2017-08-10
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 2023-01-08
    • 2011-05-21
    • 2011-02-01
    相关资源
    最近更新 更多