将Array作为参数传递给function

时间:2012-12-20 07:00:15

标签: c arrays pass-by-reference

我怀疑将数组作为函数的参数传递,我的代码如下,

  #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;
  }

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

3 个答案:

答案 0 :(得分:2)

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

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

另外,请注意关于数组的基本规则是:
&#34;数组不可分配,您必须复制数组中的每个元素。&#34;

您拥有的代码是equivalent to

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

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

 ptr1 = ptr2;

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

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

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

答案 1 :(得分: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);
}

答案 2 :(得分:0)

您将其解释为错误,实际上是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);

或者,尝试使用char将char复制到目标数组中。

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

但如果数组a没有足够的空间来保存复制的字符,则可能会出现问题。