将2d数组复制到另一个数组

时间:2014-09-15 20:31:52

标签: c arrays 2d

我正在从“C Primer Plus”一书中学习C编程语言。我正在解决一个练习而且撞墙了:

  

编写一个初始化二维3×5数组的程序,并使用基于VLA的函数将其复制到第二个二维数组。还提供基于VLA的函数来显示两个数组的内容。通常,这两个函数应该能够处理任意N×M阵列。 (如果您无法访问支持VLA的编译器,请使用可处理N×5阵列的传统C函数方法。)

我不能使用VLA,因为我的编译器不支持它,我使用VC2013。这是我的代码:

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#include <stdio.h>

#define LIM1 10
#define LIM2 10
#define LIM3 2
int ct, ct2, size;

void copy_arr(double *[LIM3], double *[LIM3], int size, int lim);
int main(void)
{
    double arr1[LIM1][LIM2], arr2[LIM1][LIM2];

    printf("Enter the size of the array\n");
    scanf("%d", &size);
    printf("Enter the array elements\n");

    for (ct = 0; ct < size; ct++)
    {
         for (ct2 = 0; ct2 < LIM3; ct2++)
         {
             scanf("%lf", &arr1[ct][ct2]);
         }
    }
    printf("\n");

    for (ct = 0; ct < size; ct++)
    {
        for (ct2 = 0; ct2 < LIM3; ct2++)
        {
            printf("%.2f ", arr1[ct][ct2]);
        }
        printf("\n");
    }
    printf("\n");

    copy_arr(arr1, arr2, size, LIM3);

    for (ct = 0; ct < size; ++ct)
    {
        for (ct2 = 0; ct2 < LIM3; ++ct2);
        {
            arr2[ct][ct2] = arr1[ct][ct2];
            printf("%.2f ", arr2[ct][ct2]);
        }
        printf("\n");
    }
    printf("\n"); 

    system("pause");

}

void copy_arr(double (*arr1)[LIM3], double (*arr2)[LIM3], int size, int lim)
{
     for (ct = 0; ct < size; ct++)
     {
         for (ct2 = 0; ct2 < lim; ct2++)
         {
             arr2[ct][ct2] = arr1[ct][ct2];
         }
     }

return;
}

输出:http://postimg.org/image/mnswuyy2b/

我无法弄清楚如何将size变量的值传递给函数copy_arr。 除了VLA之外还有其他方法吗?

1 个答案:

答案 0 :(得分:2)

arr1[LIM1][LIM2]是一个大小为LIM1的数组LIM2的数组。因此copy_arr的签名应为:

void copy_arr(double arr1[LIM1][LIM2], double arr2[LIM1][LIM2], int size, int lim);

或因为C ++允许省略第一维:

void copy_arr(double arr1[][LIM2], double arr2[][LIM2], int size, int lim);

或者,由于数组到指针的转换,数组可以转换为指向大小为LIM2的数组的指针:

void copy_arr(double (*arr1)[LIM2], double (*arr2)[LIM2], int size, int lim);

您的代码中还有另一个问题:

    for (ct2 = 0; ct2 < LIM3; ++ct2);

最后一个分号使得以下{}块不属于循环。删除它。

Online Demo