使用指针C将2维数组传递到函数中

时间:2016-01-21 11:40:48

标签: c arrays pointers

以下是我的代码示例(魔术方块):

    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-我仍然是编程的初学者,所以我希望你能解释一下。

  • 非常感谢大家,最后我使用了指向指针和指针数组的指针。

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;
}