如何指向一个数组

时间:2012-03-04 02:36:35

标签: c arrays pointers pass-by-reference argument-passing

我正在为OpenGL编写着色器,我需要能够传入一组数据。我需要能够通过引用传递,因为我无法复制整个数组。我知道您无法使用Vertices *v[100];定义指向结构数组的指针,因为这将创建一个指针数组。

我认为你可以使用bindArrayFunction(&v);传递c数组中第一个元素的内存位置,但是我应该如何使用它?我会通过结构的大小来增加指针以获得每个顶点吗?

任何帮助或意见将不胜感激。

3 个答案:

答案 0 :(得分:2)

在C和C ++中,数组从不按值传递。

当数组类型出现在函数声明中时(如void f(int a[])中所示),类型将隐式转换为相应的指针类型(如void f(int* a)中所示)。

在大多数表达式中使用数组的名称时,它会隐式转换为指向其第一个元素的指针。因此,给定int v[100],当您调用f(v)时,会传递指向v的初始元素的指针。 (隐式转换有几个例外,最明显的是当数组是sizeof或一元&运算符的操作数时)。

指针算法总是根据指向元素的大小来完成。因此,给定v + 1,数组v被隐式转换为指向其初始元素的指针(相当于&v[0])并递增sizeof(int)个字节,指向{ {1}}。

答案 1 :(得分:1)

只需引用它就好像它是一个数组。

void bindArrayFunction(Vertices *v, int size) {
  for (int i = 0; i < size; ++i) {
    process(v[i]);
  }
}

答案 2 :(得分:0)

在大多数情况下,数组衰减指向其第一个元素的指针。所以如果你有一个功能:

void foo(int *p)
{
    printf("%d\n", p[2]);
}

然后这两个电话是相同的:

int array[10];

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

在这两种情况下,单个指针都传递给函数,允许函数访问整个数组。