在函数中使用2D数组:错误

时间:2014-12-21 18:54:27

标签: c multidimensional-array

我尝试在2D数组中设置值并使用Function打印它。

但是我很难将数组发送到函数。

#include <stdio.h>

void SetArr(int (*arr)[], int n);
void PrintfArr(int (*arr)[], int n);

int main()
{ 
    int arr[100][100];

    for(int i=0; i<100; i++)
        for(int j=0; i<100; j++)
            arr[i][j]=0;         //initiallize Array

     int size;

    printf("input Size : "); scanf("%d", &size);

    SetArr(arr, size);
    PrintfArr(arr, size);

    return 0;
}

void SetArr(int (*arr)[], int n)
{
   int i, j;

    for(i=0; i<n; i++)
   {
       for(j=0; j<n; j++)
            arr[i][j]=i+j;    // Error! "Subscript of Pointer to imcomplete~
   }
}

void PrintArr(int (*arr)[], int n)
{
   int i, j;

   for(i=0; i<n; i++)
   {
       for(j=0; j<n; j++)
           printf("%d", arr[i][i]);  // Error! "Subscript of Pointer to imcomplete~
   }
   printf("\n");
}

如您所见,两个功能在使用&#34; arr [] []&#34;

时遇到了同样的问题

2 个答案:

答案 0 :(得分:1)

在函数声明中,必须提及数组的大小(长度)。这就是编译器在表示“不完整类型”时的含义:它需要大小来理解如何访问其元素。

为了使编译器可以使用大小,它应首先在函数声明中使用:

void SetArr(int n, int (*arr)[n])

这里arr在技术上是“指向n元素数组的指针”,但在C语言中,习惯上将指针视为数组,因此arr可以被视为“一组n元素数组“,与二维数组相同。

您可能想要提及数组的两个维度:

void SetArr(int n, int arr[n][n])

这相当于第一个声明,但似乎更清楚。

答案 1 :(得分:0)

声明像

这样的函数
void SetArr( int ( *arr )[100], int n );
void PrintfArr( int ( *arr )[100], int n );

您不能声明您标记为最佳

的答案中显示的功能

考虑以下代码而不是100我使用3作为数组维度。 如果您将在PrintArr函数和main中打印数组,您将得到不同的结果!

#include <stdio.h>

void SetArr( size_t n, int (*arr)[n] )
void PrintArr( size_t n, int (*arr)[n] )


int main(void) 
{
    int arr[3][3];

    size_t n = 2;

    SetArr( n, arr );
    PrintArr( n, arr );


    printf( "\n" );

    for ( size_t i = 0; i < n; i++ )
    {
        for ( size_t j = 0; j < n; j++ ) printf( "%2d", arr[i][j] );
        printf( "\n" );
    }

    return 0;
}

void SetArr( size_t n, int (*arr)[n] )
{
    for ( size_t i = 0; i < n; i++ )
    {
        for ( size_t j = 0; j < n; j++ ) arr[i][j] = i * n + j;
    }
}

void PrintArr( size_t n, int (*arr)[n] )
{
    for ( size_t i = 0; i < n; i++ )
    {
        for ( size_t j = 0; j < n; j++ ) printf( "%2d", arr[i][j] );
        printf( "\n" );
    }
}

程序输出

 0 1
 2 3

 0 1
 3 1

如您所见,第一个输出与第二个输出不一致。如果函数声明为我在帖子开头指出的函数,您将得到正确的结果。例如

#include <stdio.h>

void SetArr( int (*arr)[3], size_t n );
void PrintArr( int (*arr)[3], size_t n );


int main(void) 
{
    int arr[3][3];

    size_t n = 2;

    SetArr( arr, n );
    PrintArr( arr, n );


    printf( "\n" );

    for ( size_t i = 0; i < n; i++ )
    {
        for ( size_t j = 0; j < n; j++ ) printf( "%2d", arr[i][j] );
        printf( "\n" );
    }

    return 0;
}

void SetArr( int (*arr)[3], size_t n )
{
    for ( size_t i = 0; i < n; i++ )
    {
        for ( size_t j = 0; j < n; j++ ) arr[i][j] = i * n + j;
    }
}

void PrintArr( int (*arr)[3], size_t n  )
{
    for ( size_t i = 0; i < n; i++ )
    {
        for ( size_t j = 0; j < n; j++ ) printf( "%2d", arr[i][j] );
        printf( "\n" );
    }
}

程序输出

 0 1
 2 3

 0 1
 2 3

正如您在本案中所看到的,两个输出重合。