为什么我得到"警告:从不兼容的指针类型分配[默认启用] |"

时间:2017-06-12 08:36:24

标签: c arrays pointers

为什么我得到这个警告?输出是正确的,因为我想。这是一个简单的指针练习。但我得到了不必要的警告。请帮忙。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
main()
{
int a,b,c,i,j,k=0;
scanf("%d%d", &a, &b);
int arr[a][b];
int *ptr[b];
ptr[b]=arr;
for(i=0;i<a;i++)
{
    for(j=0;j<b;j++)
    {
        *(*(arr+i)+j)=k;
        k++;
    }
}
for(i=0;i<a;i++)
{
    for(j=0;j<b;j++)
    {
        printf("%d\t",*(*(arr+i)+j));
    }
    printf("\n");
}
return 0;

}

3 个答案:

答案 0 :(得分:1)

因为数组int [a][b](2D int数组)不是与int*(int指针)的兼容类型。在表达式中使用时,2D数组会衰减到指向第一个元素的指针,在这种情况下,它将是指向{1}}类型的1D数组的数组指针。

因此,行int(*)[b]没有任何意义,它也可以访问数组ptr[b]=arr;

如果您希望指向2D数组中的第一个项目,则必须键入

ptr

答案 1 :(得分:0)

是的,我已经弄明白了。现在,我理解我的错误。

int* ptr[b];
ptr[b]=arr;

完全错了。在这里我声明了一个“ptr”数组,它是指向整数的指针,并将指针“arr”分配给“ptr [b]”,它是指向integer.as的指针,arr是2D数组返回arr [0] [0]的地址。但是 ptr [b]是指向integer.so的指针,它们不一样。(实际上,“ptr [b] = arr”没有任何意义。首先,我没有理解它,但现在我已经修复了它

int (*ptr)[b];
ptr=arr;

现在它没有任何警告。

答案 2 :(得分:-1)

我已将代码更改为以下列表:

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<time.h>
    int main()
    {
        int a,b,i,j;

        scanf("%d%d", &a, &b);
        int *arr[a][b];
        int *ptr[b];
        int *k = 0;
        ptr[b]=arr[a][b];
        printf("\n%s%p","pointer = ",ptr[b]);
        for(i=0;i<a;i++)
        {
          for(j=0;j<b;j++)
        {
            *(*(arr+i)+j)=k;
              k++;
        }
        }
        for(i=0;i<a;i++)
       {
       for(j=0;j<b;j++)
       {
                printf("%p\t",*(*(arr+i)+j));
        }
        printf("\n");
        }
        return 0;
        }