如何在c中传递二维子数组的起始索引?
我想用C传递二维子数组,因为我们可以传递一维子数组: 我通过了一维子阵列,如下所示:如何在c中传递二维子数组的起始索引?,c,for-loop,multidimensional-array,function-declaration,C,For Loop,Multidimensional Array,Function Declaration,我想用C传递二维子数组,因为我们可以传递一维子数组: 我通过了一维子阵列,如下所示: 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}}; 代码 #include <
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}};
代码
#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;
}
#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;
}
但是对于二维数组我怎么能做同样的事情呢?
我有一个二维阵列,如下所示:
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 *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;
}
#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;
}
我不知道这个输出是如何生成的,也请告诉我如何通过传递地址来实现我的目标
注意:我通过了&arr[1]
,因为通过&arr[1][1]
表示函数参数的指针类型不兼容
我知道我们可以用其他方法来做,但是,我怎样才能像在一维阵列中那样传递子阵列呢
如果在任何方面都不可能,那么请告诉我它背后的主要原因是什么,因为该方法适用于一维阵列,但不适用于二维阵列
因为我认为传递arr
也是这样做的(即以arr[0][0]
arr[1][0]的身份访问其成员)
等等。那么为什么不传递子数组的起始索引来轻松获得整个子数组呢。实现这一点的一种方法是传递原始维度的arr
和起始索引,srow
和scol
,然后在这些索引处开始循环
#include <stdio.h>
void print_array(int row, int column, int srow, int scol, int (*arr)[column])
{
for (int i = srow; i < row; i++)
{
for (int j = scol; 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(6, 6, 1, 1, arr);
return 0;
}
#包括
无效打印数组(int行、int列、int行、int scol、int(*arr)[column])
{
对于(int i=srow;i|
我建议使用嵌套的std::array
或std::vector
。如果在运行期间数组大小未知,请使用vector。如果数组大小已知,请使用std::array
#include <array>
using nested_int_array = std::array<std::array<int, 6> >, 6>; //6 = size of array
void printsubarray(int begin_row, int begin_column, const nested_int_array& ar)
{
for (int r = begin_row; r < ar.size(); r++)
{
for (int c = begin_column; c < ar[0].size(); c++)
{
printf("%i ", ar[r][c]);
}
printf("\n");
}
}
#包括
使用嵌套的_int_array=std::array,6>;//6=数组大小
void printsubarray(int begin_行、int begin_列、常量嵌套的int_数组和ar)
{
对于(int r=begin_row;r
如果您有这样的二维数组
enum { M = 6, N = 6 };
int arr[M][N] =
{
{ 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 }
};
并希望从行位置pos
开始输出,其中pos
是小于M
的某个值,然后可以将其传递给类似表达式的函数
arr + pos
不能更改数组中一行的元素数。因此,指定子数组的函数参数必须如下所示
int ( *arr )[columns]
其中columns
指定原始数组中的实际列数
您还需要传递给函数的是要从中输出子数组的起始列数
这是一个演示程序
#include <stdio.h>
void print_array( size_t rows, size_t columns, size_t pos, int ( *arr )[columns] )
{
if ( pos < columns )
{
for ( size_t i = 0; i < rows; i++ )
{
for ( size_t j = pos; j < columns; j++ )
{
printf( "%2d ", arr[i][j] );
}
putchar( '\n' );
}
}
}
int main(void)
{
enum { M = 6, N = 6 };
int arr[M][N] =
{
{ 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 }
};
for ( size_t pos = 1; pos < M; ++ pos )
{
print_array( M - pos, N, pos, arr + pos );
putchar( '\n' );
}
return 0;
}
请注意,行的起始地址和列的起始地址不必相等
print_array( M - 3, N, 1, arr + 3 );
你所说的逻辑上是不可能的。你不能像这样剪切二维子数组。想想看。即使你能传递一些起始索引,你也会从那里开始,然后当你改变行时,你会在起始索引后面结束。你不能像这样剪切列。你可以传递原始维度和星号然后,在索引之前,只使用一个<代码>如果条件,这些索引是标记C,而不是C++。有C.It < C,而不是C++ >:<代码> STD::数组< /COD>或<代码>:ST::向量< /代码>