Как указать на массив - PullRequest
0 голосов
/ 04 марта 2012

Я пишу шейдер для OpenGL, и мне нужно иметь возможность передавать массив данных. Мне нужно быть в состоянии передать по ссылке, потому что я не могу скопировать весь массив. Я знаю, что вы не можете определить указатель на массив структур с помощью Vertices *v[100];, потому что это создаст массив указателей.

Я думаю, вы можете передать ячейку памяти первого элемента в массиве c с помощью bindArrayFunction(&v);, но тогда как мне его использовать? Я бы увеличил указатель на размер структуры, чтобы получить каждую вершину?

Любая помощь или комментарии будут оценены.

Ответы [ 3 ]

2 голосов
/ 04 марта 2012

В C и C ++ массив никогда не передается по значению.

Когда в объявлении функции появляется тип массива (как в void f(int a[])), этот тип неявно преобразуетсяк соответствующему типу указателя (как в void f(int* a)).

Когда вы используете имя массива в большинстве выражений, оно неявно преобразуется в указатель на его первый элемент.Итак, учитывая int v[100], когда вы вызываете f(v), передается указатель на начальный элемент v.(Существует несколько исключений для неявного преобразования, особенно когда массив является операндом оператора sizeof или унарного &).

Арифметика указателя всегда выполняется с точки зрения размера указанногок элементу.Таким образом, с учетом v + 1 массив v неявно преобразуется в указатель на свой начальный элемент (эквивалентный &v[0]) и увеличивается на sizeof(int) байт, указывая на v[1].

1 голос
/ 04 марта 2012

Просто ссылайтесь на него, как на массив.

void bindArrayFunction(Vertices *v, int size) {
  for (int i = 0; i < size; ++i) {
    process(v[i]);
  }
}
0 голосов
/ 04 марта 2012

В большинстве случаев массив распадается на указатель на свой первый элемент.Так что если у вас есть функция:

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

, тогда эти два вызова идентичны:

int array[10];

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

В обоих случаях в функцию передается один указатель, позволяющий функции получить доступвесь массив.

...