如何将返回的数组直接复制到另一个数组?

时间:2014-02-22 10:17:14

标签: c arrays return-value

我一直在学习数组,但有一点我无法弄清楚。 我为C借了两本书并在线查看,但没有找到解决办法。

我的函数timesTen将我拥有的每个数组elemenet乘以10, 然后返回该数组的指针返回函数main()

如何直接在数组x [2]中复制数组a [2]?

我通常会使用for循环,但我不能,因为参数有两个不同的函数。

解决方案可能与指针有关,所以请随意在这里发布sollution,但是还有什么方法可以解决它们吗?

继承源代码:

#include <stdio.h>

int timesTen(int a[])
{
    int i;
    for (i=0;i<2;i++)
    {
    printf("%d\t", a[i]);
    a[i]*=10;
    printf("%d\n", a[i]);
    }
    return a;
}

int main()
{
    int i;
    int x[2];
    int a[2]={10,50};

// i know here's an error, but how do I fix it? I cant put x[0]=timesTen(a[0])
    x[2]  =  timesTen(a);
//also what if there is array a[10], and I want to copy it in x[5] 
    for (i=0;i<2;i++)
        printf("%d\n", x[i]);
    return 0;
}

谢谢!

5 个答案:

答案 0 :(得分:1)

在函数timesTen中,由于a是一个数组,因此在函数中对它进行的每个修改也都是对你传递的参数进行的(按地址调用而不是按值调用)。因此,您不需要返回任何内容。

void timesTen(int a[])
{
    int i;
    for (i=0;i<2;i++) a[i]*=10;
}

你只需通过以下方式来打电话:

timesTen(a);

答案 1 :(得分:1)

您需要了解的是数组和指针之间的区别。在main()中声明两个数组时,为两个整数分配两次内存。没关系。但是在C语言中,你根本无法传递数组(如:隐式分配一堆新的内存并将源数组的数据复制到这个内存区域)。相反,几乎在所有情况下,任何数组标识符都将衰减到指向数组的第一个元素的指针。所以当你写

int x[2];
int a[2]={10,50};
timesTen(a);

此代码恰好等同于

int x[2];
int a[2]={10,50};
timesTen(&a[0]);

那么,为什么这与timesTen()的声明没有冲突?因为函数声明中的数组参数在那里当场衰减成指针!所以,你的函数声明正好等同于这个:

int timesTen(int* a) {

这是C语言中最不被理解的特性之一,并且不可否认,很难将你的大脑包裹起来,但是一旦你理解了指针衰减意味着什么,你就可以更轻松地使用指针和数组了。

所以,回到你的问题。由于您只将指向数组的指针传递给timesTen(),并且由于您修改了此数组,因此更改可在main()中直接显示。有两种方法可以实现您想要的行为:

  1. 您可以更改timesTen()的定义,将数据复制到目标数组中:

    void timesTen(int size, int* source, int* dest) {
        for(int i = 0; i < size; i++) dest[i] = 10*source[i];
    }
    
    int main() {
        int x[2];
        int a[2]={10,50};
        timesTen(2, a, x);    //pointer decay!
        //x now contains {100, 500}
    }
    
  2. 您可以在调用函数之前将数据复制到目标数组中以修改目标数组:

    void timesTen(int size, int* data) {
        for(int i = 0; i < size; i++) data[i] = 10*data[i];
    }
    
    int main() {
        int x[2];
        int a[2]={10,50};
        memcpy(x, a, sizeof(a));    //the sizeof operator is one of only two places where no pointer decay happens!
        timesTen(2, x);    //pointer decay!
        //x now contains {100, 500}
    }
    

答案 2 :(得分:0)

你可能想要这样的东西:

 timesTen(a);
 memmove(x, a, 2 * sizeof(x[0]));

而不是

 x[2]  =  timesTen(a);

请注意,您的函数不需要返回任何内容,因为它正在修改其原始位置的数组。在C中如果你有一个数组参数,则意味着只传递一个指针,而不是整个数组。

答案 3 :(得分:0)

主要功能

   int *p;
   int i;

   p = timesTen(a);
   for ( i = 0; i < 2; i++ )
   {
       printf( "%d\n",*(p + i)); // here you can print the values returned from your function 
   }

答案 4 :(得分:0)

通过指针,您可以轻松管理它

main ()
     { 
        int a[ 2 ];
        int *ptr = timesTen(a);
        for ( int i=0; i<2 ; i++)
              {
                  printf("%d",ptr[i]);
              }

至于

  x[2] = timesTen(a);

请注意x [2]会给出“来自x的基地的adrees的第二个地址的值” 它不是一个变量,但它是一个值,你不能分配给一个值。 从技术上讲,x [2]不是左值。