#include<stdio.h>
void display(int *q,int,int);
int main(){
int a[3][4]={
2,3,4,5,
5,7,6,8,
9,0,1,6
};
display(a,3,4);
return 0;
}
void display(int *q,int row,int col){
int i,j;
for(i=0;i<row;i++){
for(j=0;j<col;j++){
printf("%d",*(q+i*col+j));
}
printf("\n");
}
printf("\n");
}
为什么这段代码在gcc中显示警告&#34;传递参数1&#39;显示&#39;来自不兼容的指针类型显示(a,3,4)&#34;?...无论如何都成功运行但很想知道错误..如果有人能说出来我会很感激..
答案 0 :(得分:1)
因为它们是不兼容的指针类型,只是int *
可能指向int
s的数组,而int[][]
是int
数组,排列在重点内存中
重要的区别在于,虽然您可以使用两个索引表示法访问a
,但a[i][j]
却无法使用q
进行访问。
答案 1 :(得分:1)
&#34;阵列衰变的规则&#34;意味着每当您使用数组名称int a [10]
作为表达式的一部分时,它就会衰减&#34;指向第一个元素的指针。
对于1D阵列,这非常简单。数组int*
会衰减为int a[3][4]
类型。
然而,在二维阵列的情况下,2D阵列的第一个元素是一维阵列。在您的情况下,int [4]
的第一个元素具有数组类型int (*)[4]
。
数组衰减规则为您提供了一个指向此类数组的指针,一个类型为int*
的数组指针。此类型与函数所需的类型#include <stdio.h>
void display (int row, int col, int arr[row][col]);
int main()
{
int a[3][4]=
{
{2,3,4,5},
{5,7,6,8},
{9,0,1,6},
};
display(3, 4, a);
return 0;
}
void display (int row, int col, int arr[row][col])
{
for(int i=0; i<row; i++)
{
for(int j=0; j<col; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
printf("\n");
}
不兼容。
然而,幸运的是,看起来数组指针和普通的int指针在您的系统上具有相同的表示,并且它们碰巧保持相同的地址,因此代码可以工作。你不应该依赖于此,它不是明确定义的行为,并且不能保证它会起作用。
您应该按以下方式修复您的计划:
int(*)[4]
这里作为函数参数的数组类型将默默地进行调整&#34;由编译器指向第一个元素{{1}}的指针,该元素匹配从调用者传递给函数的内容。