请帮我搞简单程序吗?我很开心,我的英语不好,很难理解。 :/
方案:
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');
}
}
请,你能帮我解决这个问题吗?非常感谢你。
答案 0 :(得分:1)
您错过了参数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 Function with parameter without type indicator still works?。
答案 1 :(得分:1)
P
函数定义中tisk_pole
参数的类型必须与函数调用中参数P1
的类型匹配。
P1
的类型为char [3][3]
- 即3个元素的char
数组的3元素数组。因此,P
中tisk_pole
参数的声明必须是以下之一:
void tisk_pole( char P[3][3] )
或
void tisk_pole( char P[][3] )
或
void tisk_pole( char (*P)[3] )
除非它是sizeof
或一元&
运算符的操作数,或者是用于在声明中初始化字符数组的字符串文字,否则表达式为&#34; N-元素数组T
&#34;将被转换(&#34;衰减&#34;)到类型为&#34的表达式;指向T
&#34;的指针,并且表达式的值将是第一个元素的地址。阵列。
在函数调用中
tisk_pole( P1 );
表达式 P1
具有char
&#34;的3元素数组的类型&#34; 3元素数组; (char [3][3]
);因为它不是sizeof
或一元&
运算符的操作数,所以它被转换为类型为#34的表达式;指向char
&的3元素数组的指针#34; (char (*)[3]
)并评估P1
的第一个元素的地址。这意味着tisk_pole
接收指针值,而不是数组值。
在函数参数声明中,T a[N]
,T a[]
和T *a
都意味着相同的事情 - 它们都将a
声明为指针到T
,而不是T
的数组。但是,在函数参数声明中,这只是 true。
您可以像对数组一样使用指针上的[]
下标运算符,因此P[i][j]
的工作方式与您预期的完全相同。