c语言 - "value is neither array nor pointer nor vector"在我的简易程序中



你能帮我一下这个简单的程序吗?我是一个乞丐,我的英语不好,很难理解。:/

计划:

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]完全按照您的期望工作。

最新更新