通过指针将多个数组传递给函数

时间:2010-07-31 23:34:51

标签: c++ arrays function pointers

如何通过c ++指针将多阵列传递给函数。我可以用简单的数组

来做到这一点
void Foo(int *arr) { }
int someArr[10];
Foo(someArr);

二维数组怎么样?

3 个答案:

答案 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);