虽然您访问区域元素的方式不会根据您声明数组的方式而改变,但您将数组作为参数传递的方式将根据您是否有实际的二维数组或是否有pointer-to-pointer-to-type.
如果声明类似于int array[X][Y]; 的真正数组(其中X 和Y 是定义的常量),您可以将pointer to array of int [Y](例如(*array)[Y])作为参数传递给您的函数。
如果数组将被转换为 pointer-to-pointer-to-type,当声明类似于 int **array; 或 int (*array)[z]; 时,您在其中分配每个指针和块行或单个块,您只需传递一个pointer-to-pointer-to-type(例如int **array)
无论哪种情况,您都可以使用一个简单的函数来更改数组中的一个区域,该函数迭代您希望更改的元素。例如,对于您指定的二维数组的情况,您可以声明一个具有类似于以下逻辑的函数。 (您可以根据需要传递其他参数以实现所需的任何更改)
enum { ROW = 10, COL = 10 }; /* constant definitions */
...
void chgregion (int (*a)[COL], int xs, int ys, int xn, int yn)
{
int xlim = xs + xn, /* xstart + xnumber_of_elements */
ylim = ys + yn; /* same for y */
if (xlim > ROW) xlim = ROW; /* protect array/block bounds */
if (ylim > COL) ylim = COL;
for (int i = xs; i < xlim; i++)
for (int j = ys; j < ylim; j++)
a[i][j] = 1; /* change element as required */
}
在指向COL 元素数组的指针上方,连同x 和y 在数组中的起始位置以及区域中的元素数量一起传递,例如xn 和 yn。进行了简单的检查以限制区域大小以保持在数组边界或内存块的边界内。如果您的数组实际上是一个指向类型的指针,只需传递 int **a 并将内存块的尺寸作为附加参数传递。
你可以整理一个简单的测试如下:
#include <stdio.h>
enum { ROW = 10, COL = 10 };
void chgregion (int (*a)[COL], int xs, int ys, int xn, int yn);
void prna (int (*a)[COL]);
int main (void) {
int a[ROW][COL] = {{0}};
prna (a);
chgregion (a, 2, 2, 6, 6);
putchar ('\n');
prna (a);
return 0;
}
void chgregion (int (*a)[COL], int xs, int ys, int xn, int yn)
{
int xlim = xs + xn,
ylim = ys + yn;
if (xlim > ROW) xlim = ROW;
if (ylim > COL) ylim = COL;
for (int i = xs; i < xlim; i++)
for (int j = ys; j < ylim; j++)
a[i][j] = 1;
}
void prna (int (*a)[COL])
{
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++)
printf ("%2d", a[i][j]);
putchar ('\n');
}
}
使用/输出示例
$ ./bin/array2d_region
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 1 1 1 1 1 1 0 0
0 0 1 1 1 1 1 1 0 0
0 0 1 1 1 1 1 1 0 0
0 0 1 1 1 1 1 1 0 0
0 0 1 1 1 1 1 1 0 0
0 0 1 1 1 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
让我知道这是否是您的意图,或者您所做的是否在某些方面有所不同。如需进一步帮助,请发帖Minimal, Complete, and Verifiable example。