在2D数组上使用指针起作用

时间:2019-12-02 15:05:26

标签: c arrays pointers

我对编程很陌生,所以如果这听起来是一个不好的问题,我感到很抱歉。

我的代码:

#include <stdio.h>

void Order(int *waiterList){

    printf("Number is %d", *waiterList[0][1]);

}

int main(){

    int waiterList[3][3] = {{1,2,3},{4,5,6},{7,8,9}};

    Order(&waiterList);

    return 0;
}

此代码给我这个错误:

pointer.c: In function 'Order':
pointer.c:5:39: error: subscripted value is neither array nor pointer nor vector
printf("Number is %d", *waiterList[0][1]);

pointer.c: In function '`enter code here`main':
pointer.c:13:8: warning: passing argument 1 of 'Order' from incompatible pointer type [- 
Wincompatible-pointer-types]
  Order(&waiterList);

pointer.c:3:6: note: expected 'int *' but argument is of type 'int (*)[3][3]'
void Order(int *waiterList){

对不起,我以前从未使用过数组,但是我们的最终项目要求我们使用数组,我发现很难理解我在Google上找到的文章...希望您能帮助一个学生,这也是我的第一次在这里发布是因为我有点绝望。

2 个答案:

答案 0 :(得分:1)

实现此目标的简单方法是

#include <stdio.h>

void Order(int waiterList[3][3]){  // receive an array of type `int [3][3]`
    printf("Number is %d", waiterList[0][1]);

}

int main(){

    int waiterList[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
    Order(waiterList);  // just pass the array name

    return 0;
}

如果必须使用指针,请使用适当的类型:

#include <stdio.h>

void Order(int (*waiterList)[3][3]){   // pointer to an array of type `int[3][3]`

    printf("Number is %d", (*waiterList)[0][1]);

}

int main(){

    int waiterList[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
    Order(&waiterList);  // pass the address of the array

    return 0;
}

答案 1 :(得分:0)

将数组 decay 指向指向其第一个元素的指针,对于通用数组a,它会衰减到&a[0]

对于类似waiterList函数中的main的数组,当它衰减到指向其第一个元素(&waiterList[0])的指针时,其类型将为数组”。更具体地说,对于waiterList,类型变为int (*)[3]。其中必须是Order函数的参数类型:

void Order(int (*waiterList)[3]){
    printf("Number is %d", waiterList[0][1]);
}

您称它为传递数组的变量,而无需任何指针或地址运算符:

Order(waiterList);