在我的简单程序中,“值既不是数组也不是指针也不是矢量”

时间:2016-11-10 17:40:31

标签: c arrays pointers 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');
    }
}

请,你能帮我解决这个问题吗?非常感谢你。

2 个答案:

答案 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元素数组。因此,Ptisk_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]的工作方式与您预期的完全相同。