你能帮我一下这个简单的程序吗?我是一个乞丐,我的英语不好,很难理解。:/
计划:
void tisk_pole (P);
int main()
{
char P1[3][3]={{'1','2','3'},{'4','5','6'},{'7','8','9'}};
tisk_pole(P1);
return 0;
}
void tisk_pole (P){
int i, j;
for (i = 0; i < 3; i++){
for (j = 0; j < 3; j++)
printf("%c", P[i][j]); //HERE IS PROBLEM -> value is neither array nor pointer nor vector
putchar('n');
}
}
你能帮我解决这个问题吗?非常感谢。
您错过了参数P
的类型声明。
void tisk_pole(char P[3][3]) {
int i, j;
for (i = 0; i < 3; i++){
for (j = 0; j < 3; j++)
printf("%c", P[i][j]);
putchar('n');
}
}
参见C函数与参数没有类型指示仍然工作?关于编译器如何处理没有类型的形参
tisk_pole
函数定义中P
形参的类型必须与函数调用中P1
实参的类型相匹配。
P1
的类型为char [3][3]
,即char
的3元素数组的3元素数组。因此,tisk_pole
中的P
形参的声明必须是下列之一:
void tisk_pole( char P[3][3] )
或
void tisk_pole( char P[][3] )
或
void tisk_pole( char (*P)[3] )
除非是sizeof
或一元&
操作符的操作数,或者是用于在声明中初始化字符数组的字符串字面值,否则类型为"T
的n元素数组"的表达式将被转换("衰减")为类型为"指向T
的指针"的表达式,该表达式的值将是该数组的第一个元素的地址。
函数调用
tisk_pole( P1 );
表达式 P1
的类型为" char
的3元素数组的3元素数组" (char [3][3]
);由于它不是sizeof
或一元&
操作符的操作数,因此它被转换为"指向char
的3元素数组的指针"(char (*)[3]
)类型的表达式,并计算为P1
的第一个元素的地址。这意味着tisk_pole
接收一个指针值,而不是一个数组值。
在函数参数声明中,T a[N]
、T a[]
和T *a
的意思都是一样的——它们都将a
声明为指向T
的指针,而不是指向T
的数组。但是,只有在函数参数声明中为真。
您可以像在数组上一样在指针上使用[]
下标操作符,因此P[i][j]
完全按照您的期望工作。