如何通过c ++指针将多阵列传递给函数。我可以用简单的数组
来做到这一点void Foo(int *arr) { }
int someArr[10];
Foo(someArr);
二维数组怎么样?
答案 0 :(得分:2)
它或多或少相同 - 当然除了不同的位之外。
#include <stdio.h>
enum { DIM = 6 };
static void Bar(int arr[][DIM], int n)
{
int i, j;
for (i = 0; i < n; i++)
{
for (j = 0; j < DIM; j++)
printf(" %2d", arr[i][j]);
putchar('\n');
}
}
int anotherArr[][DIM] =
{
{ 1, 2, 3, 4, 5, 6 },
{ 6, 5, 4, 3, 2, 1 },
{ 0, 0, 0, 0, 0, 0 },
{ -1, -2, -3, -4, -5, -6 },
};
int main(void)
{
Bar(anotherArr, 4);
return(0);
}
答案 1 :(得分:2)
你可以通过这种方式实现你想要的目标:
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);
一般的get元素功能是:
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]
这样的2D数组,并且你想获得array[i][j]
元素,你只需要用这种方式调用函数:
getElement(&array[0][0], i, j, N)
为什么这样做?
如果您知道如何在内存中保存2D数组,则可以澄清上述功能的工作原因。数组是逐行保存的,所以假设您有以下数组:
int a[3][3] = {{1, 2, 4}, {5, 6, 7}, {8, 9, 10}};
假设一个整数是4个字节,而&amp; 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
指向[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。
答案 2 :(得分:0)
void Foo(int **arr) { }
int someArr[10][10];
Foo(someArr);