如何使用指针在C中打印阵列的多维阵列输入



我正在尝试获取整数数据并将其存储到一个维数组中,但我无法做到。有人帮我..

我尝试使用*(*(arr+i) + j),其中ARR是2-D数组的指针,ij是循环变量,我有一个错误

错误:Unary'*'的无效类型参数(have'int'(scanf("%d",((arr i( j((;

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(){
        int n,*arr,i,j,k;
        scanf("%d",&n);
        arr = malloc(n*n*sizeof(int));
        memset(arr,0,n*n*sizeof(int));
        for(i=0;i<n;i++){
                for(j=0;j<n;j++){
                        scanf("%d", *(*(arr+i) + j));
                }
        }
        for(i=0;i<n;i++){
                for(j=0;j<n;j++){
                        printf("%d ", *(*(arr+i) + j);
                }
                printf("n");
        }
}

我的输入是:

3
11 2 4
4 5 6
10 8 -12

int* arr ... arr = malloc(n*n*sizeof(int));给您一个"修理" 2D数组 - 实际上是1D数组。意味着您必须以arr[i*n + j]

访问它

混乱的阵列大多是过去的事情。使用现代标准C,您可以用以下方式替换整个代码:

int (*arr)[n] = malloc( sizeof(int[n][n]) );
...
for(size_t i=0; i<n; i++)
  for(size_t j=0; j<n; j++)
    scanf("%d", &arr[i][j]);
...
free(arr);

还要注意,如果您需要将整个数组零化为零,则最好使用calloc,因为它可以。

变量 arr的类型是 int *

int n,*arr,i,j,k;
      ^^^^

因此,您的程序中没有二维数组。

所以例如这个表达式

*(arr+i) + j

具有int类型。这个表达

*(*(arr+i) + j)

试图解除不是指针的对象的类型int的对象。

如果您的编译器支持可变长度阵列,则该程序看起来像

#include <stdio.h>
int main(void) 
{
    size_t n;
    scanf( "%zu", &n );
    int a[n][n];
    for ( size_t i = 0; i < n; i++ )
    {
        for ( size_t j = 0; j < n; j++ )
        {
            scanf( "%d", *( a + i ) + j );
        }
    }
    for ( size_t i = 0; i < n; i++ )
    {
        for ( size_t j = 0; j < n; j++ )
        {
            printf( "%3d ", *( *( a + i ) + j ) );
        }
        putchar( 'n' );
    }
    return 0;
}

其输出是

 11   2   4 
  4   5   6 
 10   8 -12 

否则,另一种方法是动态的,是为了分配一维指针阵列,然后相应的一维整数阵列。

例如

#include <stdio.h>
#include <stdlib.h>
int main(void) 
{
    size_t n;
    scanf( "%zu", &n );
    int **a = malloc( n * sizeof( int * ) );
    for ( size_t i = 0; i < n; i++ )
    {
        *( a + i ) = malloc( n * sizeof( int ) );
    }
    for ( size_t i = 0; i < n; i++ )
    {
        for ( size_t j = 0; j < n; j++ )
        {
            scanf( "%d", *( a + i ) + j );
        }
    }
    for ( size_t i = 0; i < n; i++ )
    {
        for ( size_t j = 0; j < n; j++ )
        {
            printf( "%3d ", *( *( a + i ) + j ) );
        }
        putchar( 'n' );
    }
    for ( size_t i = 0; i < n; i++ )
    {
        free( *( a + i ) );
    }
    free( a );
    return 0;
}

程序输出将与上面显示的相同。

最新更新