面试题答案
一键面试-
为何第二维大小必须指定:
- 在C语言中,二维数组在内存中是按行存储的。当把二维数组作为参数传递给函数时,函数需要知道每行的大小(即第二维的大小),以便正确计算每个元素在内存中的偏移量。如果不指定第二维大小,编译器无法确定每行的边界,也就无法正确访问数组元素。例如,假设有一个二维数组
int arr[3][4]
,在内存中它是连续存储的,若不指定第二维大小为4,编译器不知道从一个元素跳到下一行的下一个元素该跳过多少字节。
- 在C语言中,二维数组在内存中是按行存储的。当把二维数组作为参数传递给函数时,函数需要知道每行的大小(即第二维的大小),以便正确计算每个元素在内存中的偏移量。如果不指定第二维大小,编译器无法确定每行的边界,也就无法正确访问数组元素。例如,假设有一个二维数组
-
在函数内部通过数组名特性实现元素正确访问: 在C语言中,数组名在大多数情况下会被转换为指向数组首元素的指针。对于二维数组
int arr[][4]
,arr
实际上是一个指向int[4]
类型数组的指针。在函数func
内部,可以通过以下方式访问元素:
void func(int arr[][4], int rows) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < 4; j++) {
// 访问元素arr[i][j]
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
这里,arr[i][j]
本质上是*(*(arr + i)+j)
。arr + i
指向第i
行的起始地址(因为arr
是指向int[4]
类型数组的指针),*(arr + i)
获取第i
行数组的首地址(类型为int*
),*(arr + i)+j
指向第i
行第j
列元素的地址,*(*(arr + i)+j)
就是获取该元素的值。