【问题标题】:Passing 2 dimensional array into a function using pointer C使用指针 C 将二维数组传递给函数
【发布时间】:2016-04-27 15:28:07
【问题描述】:

这是我的代码示例(魔方):

    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- 我在使用指针将二维数组传递给函数时阅读了很多内容,但不知何故我仍然很困惑,如何在这段代码中表示二维数组或更多。

3- 我还是个编程初学者,希望你能解释一下。

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

【问题讨论】:

标签: c arrays pointers


【解决方案1】:

这根本不是二维数组,而是一维数组,用来模仿二维数组。

所以,内存分配是

ptr=calloc(size*size,sizeof(int));

这是一个由(size * size) 元素组成的一维数组的分配

像这样访问这个数组的数据

*(magic+i*size+j)=num;

每个元素的位置是通过添加no of rows * i + j,从基本索引计算得出的。

这些被称为平面数组。

【讨论】:

  • 现在我明白了,但如果想将其更改为 2D 应该怎么办?
  • 有很多东西需要改变。 ptr 的声明、内存分配、函数调用、函数声明和函数体都必须修改以接受二维数组而不是一维数组。之后,您需要重新编译它并查看是否需要任何其他更改。如果代码正常工作,我认为不值得付出努力。
  • 非常感谢,您的代码正在运行,但我只是在测试不同的方法以加深理解
  • 尝试用双指针重写整个内容。你会得到更好的理解。
【解决方案2】:

1- 据我所知 Arr[i][j]==*(Arr[i]+j) 那么为什么只有这个有效: (魔法+isize+j)。

Don't cast resultcalloc 当你在做的时候

ptr = calloc(size*size,sizeof(int)); 

它正在分配一维数组(或ptr 是一维数组指针)所以(magic+isize+j) 这是有效的。它只是将 2D 索引转换为 1D 以访问数组。

2- 在将二维数组传递给函数时,我阅读了很多内容 指针,但不知何故我仍然感到困惑,如何表示二维数组 或更多在此代码中。

对于将二维数组传递给函数,请查看correct way of passing 2D array.

【讨论】:

    【解决方案3】:

    终于搞定了,谢谢帮忙

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-09
      • 1970-01-01
      • 2019-03-28
      • 1970-01-01
      • 2014-12-31
      • 2018-12-08
      相关资源
      最近更新 更多