#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 中显示警告“从不兼容的指针类型 display(a,3,4) 传递 'display' 的参数 1”?...运行成功但很想知道错误..如果有人可以告诉这个我将不胜感激..
最佳答案
“数组衰减”规则意味着每当您使用数组名称 a
作为表达式的一部分时,它都会“衰减”到指向第一个元素的指针。
对于一维数组,这非常简单。数组 int a [10]
会衰减为 int*
类型。
但是,对于二维数组,二维数组的第一个元素是一维数组。在您的例子中,int a[3][4]
的第一个元素具有数组类型 int [4]
。
数组衰减规则为您提供了一个指向此类数组的指针,数组指针,类型为 int (*)[4]
。此类型与您的函数所需的 int*
类型不兼容。
然而,幸运的是,数组指针和普通 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(*)[4]
,它与传递给来自调用者的函数。
关于c - 在 gcc 中出现错误但仍然成功运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39286501/