为什么我得到这个警告?输出是正确的,因为我想。这是一个简单的指针练习。但我得到了不必要的警告。请帮忙。
#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;
}
答案 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;
}