如何在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 <

我想用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 <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::向量< /代码>