【问题标题】:"value is neither array nor pointer nor vector" in my easy program我的简单程序中的“值既不是数组也不是指针也不是向量”
【发布时间】:2017-03-24 20:24:18
【问题描述】:

你能帮我完成我的简单程序吗?我是初学者,我的英语不好,很难理解。 :/

程序:

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');
    }
}

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

【问题讨论】:

  • 改为void tisk_pole (char P[3][3]){

标签: c arrays pointers vector


【解决方案1】:

tisk_pole 函数定义中的P 参数的类型必须与函数调用中的参数P1 的类型匹配。

P1 的类型为char [3][3] - 即char 的三元素数组的三元素数组。因此,tisk_poleP 参数的声明必须是以下之一:

void tisk_pole( char P[3][3] )

void tisk_pole( char P[][3] )

void tisk_pole( char (*P)[3] )

除非它是sizeof 或一元&amp; 运算符的操作数,或者是用于在声明中初始化字符数组的字符串文字,否则为“T 的N 元素数组”类型的表达式将被转换(“decay”)为“pointer to T”类型的表达式,表达式的值将是数组第一个元素的地址。

在函数调用中

tisk_pole( P1 );

表达式 P1 的类型为“char 的 3 元素数组的 3 元素数组”(char [3][3]);因为它不是sizeof 或一元&amp; 运算符的操作数,所以它被转换为“指向char 的三元素数组的指针”(char (*)[3])类型的表达式,并计算为第一个的地址P1 的元素。这意味着tisk_pole 接收一个指针 值,而不是一个数组值。

函数参数声明中,T a[N]T a[]T *a 都表示相同的意思 - 它们都将 a 声明为 指针T,而不是T 的数组。不过,这只有在函数参数声明中是正确的。

您可以像在数组上一样对指针使用[] 下标运算符,因此P[i][j] 的工作方式与您期望的完全一样。

【讨论】:

    【解决方案2】:

    您缺少参数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?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-17
      相关资源
      最近更新 更多