以下是我的代码示例(魔术方块):
int magicsqr(int *magic,int size);
int main()
{
int size,*ptr;
char stop;
repeat:
printf("Please Enter an Odd number for the magic square(3 or greater):\n");
scanf("%d",&size);
fflush(stdin);
ptr=(int*)calloc(size*size,sizeof(int));
while((size%2==0)||(size<=1))
{
printf("U entered a wrong number.\n");
repeat1:
printf("Do you wish to continue?(Y or N)\n");
scanf("%c",&stop);
fflush(stdin);
if(stop=='Y'||stop=='y')
goto repeat;
else if(stop=='N'||stop=='n')
printf("Thanks for trying our beta program.\n");
else
{
printf("U entered a wrong character.\n");
goto repeat1;
}
}
magicsqr(ptr,size);
return 0;
}
int magicsqr(int *magic,int size)
{
int i,j,num;
i=1;
j=(size+1)/2;
for(num=1;num<=size*size;num++)
{
*(magic+i*size+j)=num;
if(num%size==0){
i++;
continue;
}
if(i==1)
i=size;
else
i--;
if(j==size)
j=1;
else
j++;
}
for(i=1;i<=size;i++)
{
printf("\n");
for(j=1;j<=size;j++)
printf("%d\t",*(magic+i*size+j));
}
}
所以我几乎没有让我感到困惑的问题......
1-据我所知Arr[i][j]==*(Arr[i]+j)
那么为什么只有这个有效:*(magic+i*size+j)
。
2-我在使用指针将2维数组传递到函数中时阅读了很多但不知何故我仍然感到困惑,如何在此代码中表示2D数组或更多。
3-我仍然是编程的初学者,所以我希望你能解释一下。
答案 0 :(得分:0)
当你正在做的时候,1-屁股我知道Arr [i] [j] == *(Arr [i] + j)所以为什么只有这个有效: (魔+ isize + j)的
calloc
的{p> Don't cast result
ptr = calloc(size*size,sizeof(int));
它正在分配1D数组(或ptr
是1D数组指针)所以(magic+isize+j)
这是有效的。它只是将2D索引转换为1D到访问数组。
2-我在将2维数组传递到函数中时阅读了很多 指针,但不知怎的,我仍然困惑,如何表示2D数组 或更多在此代码中。
要将2维数组传递到函数中,请查看correct way of passing 2D array.
答案 1 :(得分:0)
这根本不是2D数组,而是用于模拟2D数组的一维数组。
所以,内存分配是
[{
"Submission ID": "9938306",
"Lat": "17.447191666666665",
"Long": "78.38849"
},
{
"Submission ID": "9938306",
"Lat": "17.447191666666665",
"Long": "78.38849"
}]
这是{1}元素的一维数组的分配
像这样访问此数组的数据
ptr=calloc(size*size,sizeof(int));
每个元素位置都是通过添加(size * size)
* *(magic+i*size+j)=num;
+ no of rows
来从基本索引计算的。
这些被称为平面阵列。
答案 2 :(得分:0)
终于明白了,谢谢你的帮助。
int main()
{
char stop;
int i,j,size,num;
repeat:
printf("Please Enter an Odd number for the magic square(3 or greater):\n");
scanf("%d",&size);
fflush(stdin);
int **magic=(int**)malloc(size*sizeof(int*)); //size = row
if((size%2==0)||(size<=1))
{
printf("U entered a wrong number.\n");
repeat1:
printf("Do you wish to continue?(Y or N)\n");
scanf("%c",&stop);
fflush(stdin);
if(stop=='Y'||stop=='y')
goto repeat;
else if(stop=='N'||stop=='n')
printf("Thanks for trying our beta program.\n");
else
{
printf("U entered a wrong character.\n");
goto repeat1;
}
}
for(i=0;i<size;i++)
magic[i]=(int*)calloc(size,sizeof(int));
for(i=0;i<size;i++)
{
printf("\n");
for(j=0;j<size;j++)
printf("%d\t",*(magic[i]+j));
}
i=0;
j=(size)/2;;
for(num=1;num<=size*size;num++)
{
magic[i][j]=num;
if(num%size==0){
i++;
continue;
}
if(i==0)
i=size-1;
else
i--;
if(j==size-1)
j=0;
else
j++;
}
for(i=0;i<size;i++)
{
printf("\n");
for(j=0;j<size;j++)
printf("%d\t",*(magic[i]+j));
}
return 0;
}