1

我对将数组作为参数传递给函数有疑问,我的代码如下,

  #include <stdio.h>
  #include <string.h>

  void str_cpy(char a[], char b[])
  {
     a = b;
     printf("%s\n", a);
  }

  int main()
  {
     char a[] = "hello";
     char b[] = "world";

     str_cpy(a, b);
     printf ("%s\n", a);
     return 0;
  }

在上面的代码中,我将数组传递给函数是通过引用传递的,所以它应该在主函数中打印“world”,因为我在函数定义中将 b 的值分配给 a 即 a = b 但它不是,所以请帮忙我 ..

4

3 回答 3

3

当您将数组传递给函数时。它衰减为指向数组第一个元素的指针。

您的函数str_cpy()仅将传递的指针指向a另一个指针b。它不会修改原始字符数组的内容a。请注意指针a,并且b是函数的本地指针。

另外,请注意有关数组的基本规则是:
“数组不可分配,您必须复制数组中的每个元素。”

您拥有的代码相当于

 char a[] = "hello";
 char b[] = "world";

 char *ptr1 = a;
 char *ptr2 = b;

 ptr1 = ptr2;

 printf("[%s]",a);

它不会改变原始数组的内容,它只是将一个指向该数组的指针指向另一个数组。

将一个数组的每个元素复制到另一个数组是strcpy()提供的功能。您应该简单地使用标准库提供的功能。

于 2012-12-20T07:04:36.823 回答
1

你的str_cpy()函数可以写成:

void str_cpy(char *a, char *b)
{
    a = b;
    printf("%s\n", a);
}

这在语义上等同于您编写的内容;你写的和我写的在操作上没有区别。数组作为指向数组第一个元素的指针传递。它们是方便地初始化的局部指针变量。在函数的范围内,您a指向同一个地方b,但这不会影响main()程序中的数组。

要在 C 中复制数组,您必须依次复制每个元素:

void str_cpy(char *a, char *b)
{
    while ((*a++ = *b++) != '\0')
        ;
    printf("%s\n", a);
}
于 2012-12-20T07:05:18.670 回答
1

您将其解释为错误的,实际上是pass by value.

void str_cpy(char a[], char b[]) // it's same as str_cpy(char *a,char *b)
  {
     a = b;
     printf("%s\n", a); // here it will print "world" because it's a local
              // change in a but actually in main a still contains "hello"
  }

由于您正在使用<string.h>,您可以直接使用strcpy(a,b);

或者,尝试这样的方法将字符一个字符地复制到目标数组中。

str_cpy(char *a,char *b)
{
 while(*b != '\0')
  {
  *a=*b;
  a++;
  b++;
  }
}

但是如果数组a没有足够的空间来保存复制的字符,这可能是个问题。

于 2012-12-20T07:05:24.163 回答