gpt4 book ai didi

c++ - 通过指针将多数组传递给函数

转载 作者:行者123 更新时间:2023-11-30 02:11:31 25 4
gpt4 key购买 nike

如何使用 C++ 通过指针将多数组传递给函数。我可以用简单的数组来做到这一点

void Foo(int *arr) { }
int someArr[10];
Foo(someArr);

二维数组呢?

最佳答案

你可以通过这种方式实现你想要的:

void foo(int *array) { }

int column_size = 5;

int main() {
int array[column_size][2];

foo(&array[0][0]);

return 0;
}

尽管您应该注意如何从 foo 函数中读取元素。为了读取 array[c][r] 元素,您必须执行以下操作:

int element = *(array + c * column_size + r);

一般获取元素的函数是:

int get_element(int *array, int row, int column, int column_size)   {
int element = *(array + row * column_size + column);
return element;
}

所以,如果您有一个像 int array[M][N] 这样的二维数组,并且您想要获取 array[i][j] 元素你只需以这种方式调用函数:

getElement(&array[0][0], i, j, N)

为什么会这样?

如果您知道二维数组是如何保存在内存中的,那么上述函数起作用的原因就很清楚了。数组是逐行保存的,所以假设您有以下数组:

int a[3][3] = {{1, 2, 4}, {5, 6, 7}, {8, 9, 10}};

假设一个整数是 4 个字节,&a[0][0] 对应于 0x10 内存地址。然后1保存在0x10内存地址,2保存在0x14,...,7保存在0x24内存地址,...,10保存在0x30内存地址(见下表)。

*Memory*

Memory address => Value => Pointer pointing at this memory address

0x10 => 1 => &a[0][0]
0x14 => 2 => (&a[0][0] + 1) or (&a[0][1])
0x18 => 4 => (&a[0][0] + 2) or (&a[0][2])
0x1c => 5 => (&a[0][0] + 3 * 1 + 0) or (&a[1][0])
0x20 => 6 => (&a[0][0] + 3 * 1 + 1) or (&a[1][1])
0x24 => 7 => (&a[0][0] + 3 * 1 + 1) or (&a[1][2])
0x28 => 8 => (&a[0][0] + 3 * 2 + 0) or (&a[2][0])
0x2c => 9 => (&a[0][0] + 3 * 2 + 1) or (&a[2][1])
0x30 => 10 => (&a[0][0] + 3 * 2 + 2) or (&a[2][2])

现在当你有以下指针时:

int *pt = (&a[0][0] + 2);

pt 指针将指向 a[0][0] 之后的 2 个元素。所以 pt 指向 a[0][2]。 *pt 将等于 4。

现在假设您想要获取 a[i][j] 元素。为了得到这个元素您需要将 i * COLUMN_SIZE 元素移开,以便进入该元素所在的正确行(每行都有 COLUMN_SIZE 元素),然后您需要添加 j 以便进入正确的列。

如果你想得到 a[2][1](其中 COLUMN_SIZE = 3),那么 2 * COLUMN_SIZE = 6 + 1 = 7。因此,为了获得 a[2][1] 元素,您需要执行 *(&a[0][0] + 2 * 3 + 1) *(&a[0][0] + 7)

有关指针的一些很棒的教程,请查看此处:Stanford CS Ed Library .

关于c++ - 通过指针将多数组传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3380196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com