我正在尝试获取整数数据并将其存储到一个维数组中,但我无法做到。有人帮我..
我尝试使用*(*(arr+i) + j)
,其中ARR是2-D数组的指针,i
和j
是循环变量,我有一个错误
错误: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;
}
程序输出将与上面显示的相同。