为什么我不能将C中的2D char数组传递给函数
int .....(char array[ ][ ])
即方括号为空吗?
这适用于一维数组,但我不明白为什么它不适用于二维数组
答案 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*/
}