我正在为OpenGL编写着色器,我需要能够传入一组数据。我需要能够通过引用传递,因为我无法复制整个数组。我知道您无法使用Vertices *v[100];
定义指向结构数组的指针,因为这将创建一个指针数组。
我认为你可以使用bindArrayFunction(&v);
传递c数组中第一个元素的内存位置,但是我应该如何使用它?我会通过结构的大小来增加指针以获得每个顶点吗?
任何帮助或意见将不胜感激。
答案 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]);
在这两种情况下,单个指针都传递给函数,允许函数访问整个数组。