将C中的2D字符数组传递给函数

时间:2018-06-23 08:00:42

标签: c

为什么我不能将C中的2D char数组传递给函数

int .....(char array[ ][ ])  

即方括号为空吗?

这适用于一维数组,但我不明白为什么它不适用于二维数组

2 个答案:

答案 0 :(得分:1)

原因是被调用的函数需要知道数组的大小才能访问元素。

这样做的时候

int arr[7][5] = {0};

arr[3][2] = 42;

访问确实

*(arr + 3*5 + 2) = 42;
          ^
          note: the number of columns

因此,要访问2D数组中的元素,函数必须具有有关列数的信息。

因此是

int foo(char array[ ][ ]) { array[3][2] = 42; }  

无效 C代码。该函数根本不知道如何访问array[3][2]

但是你可以做

void foo(char array[][10])

void foo(int c, char array[][c])

因为在两种情况下,foo都会获取访问数组元素所需的信息。

您可以将此扩展到更高维度的数组,即该函数需要知道除第一个维度以外的所有维度的大小。示例:

void foo(char array[][42][10])

答案 1 :(得分:0)

可用于一维数组吗?因为在这种情况下,函数参数char array[ ]不是array,而是pointer。除了传递array name之外,您还要将数组size传递给函数,以便可以循环size次。这是将一维数组传递给函数的简单演示

void pass(int new_arr[],int ele) { /* here new_arr is not an array, it a pointer
*/
        /* here this pass() should know how many elements new_arr holds,
                thatswhy second arguement is no of element */
}
int main(void) {
        int arr[] = {1,2,3,4,5};
        int ele = sizeof(arr)/sizeof(arr[0]);
        pass(arr,ele);/* you are arr, means 1D array base address and no of elements */
        return 0;
}

为什么我不能将C中的2D字符数组作为int .....(char array[ ][ ])传递给函数?让我们看看尝试此操作时的编译器警告

void pass(int new_arr[][],int row) {
} 

  

数组类型的元素类型不完整

因此,当您将2D数组传递给类似函数时

int arr[2][3] = { {1,2,3}, {4,5,6}};
pass(arr,row);/* passing 2D array base address to function and you need to inform no of rows to function */

您只是传递2D数组名称,即基地址,该函数将如何知道您传递了1D数组地址还是2D数组地址。您(调用函数)需要告诉被调用函数这个2D数组包含这么多1D数组。

因此,当您将2D数组传递给函数时,被调用的函数参数应为指向数组的指针类型,例如char(*)[row]而不是char**char[][]。例如

void pass(int (*new_arr)[3],int row) { /* here new_arr points to 3 elements at a time i.e in each 1D array contains 3 elements*/

}