【发布时间】:2021-05-21 15:42:42
【问题描述】:
我想在 C 中传递二维子数组,因为我们可以传递一维子数组:
我通过了如下的一维子数组:
代码
#include <stdio.h>
void print_array(int *arr, int len)
{
for (int i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
}
int main(void)
{
int arr[] = {1, 2, 3, 4, 5};
int size = sizeof(arr) / sizeof(int);
print_array(&arr[2], size - 2);
return 0;
}
输出
3 4 5
但是我怎样才能对二维数组做同样的事情呢? 我有一个二维数组如下:
int arr[6][6] = {
{1, 2, 3, 4, 5, 6},
{2, 3, 4, 5, 6, 7},
{3, 4, 5, 6, 7, 8},
{4, 5, 6, 7, 8, 9},
{5, 6, 7, 8, 9, 10},
{6, 7, 8, 9, 10, 11}};
我想传递arr[1][1] 元素的索引,以便打印子二维数组:
3 4 5 6 7
4 5 6 7 8
5 6 7 8 9
6 7 8 9 10
7 8 9 10 11
我尝试如下,但没有成功:
代码
#include <stdio.h>
void print_array(int row, int column, int (*arr)[column])
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < column; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
int main(void)
{
int arr[6][6] = {
{1, 2, 3, 4, 5, 6},
{2, 3, 4, 5, 6, 7},
{3, 4, 5, 6, 7, 8},
{4, 5, 6, 7, 8, 9},
{5, 6, 7, 8, 9, 10},
{6, 7, 8, 9, 10, 11}};
print_array(5, 5, &arr[1]);
return 0;
}
输出
2 3 4 5 6
7 3 4 5 6
7 8 4 5 6
7 8 9 5 6
7 8 9 10 6
我不知道这个输出是如何产生的,也请告诉我如何通过传递地址来实现我的目标。
注意:我已经通过了&arr[1],因为通过&arr[1][1] 表示incompatible pointer type for the function argument。
我知道我们可以通过其他方式做到这一点,但是,我怎样才能像在一维数组中那样传递子数组?
如果以任何方式都不可能,那么请告诉我背后的主要原因是什么,因为该方法适用于一维数组但不适用于二维数组。
因为我认为传递arr 是做同样的事情(即以arr[0][0]arr[1][0] 等方式访问其成员。那么为什么不传递子数组的起始索引以轻松获取整个子数组。
【问题讨论】:
-
你所说的在逻辑上是不可能的。你不能像这样切割二维子阵列。想一想。即使您能够传递一些起始索引,您也会从那里开始,然后当您更改行时,您最终将落后于起始索引。你不能这样剪列。
-
您可以改为传递原始尺寸和起始索引。然后在打印那些在起始索引之前的索引时,只需使用
if条件。
标签: c for-loop multidimensional-array function-declaration