2012-03-04 4 views
0

私はOpenGL用のシェーダーを書いており、データの配列を渡す必要があります。私は配列全体をコピーすることができないので、参照渡しできる必要があります。 Vertices *v[100];で構造体の配列へのポインタを定義することはできません。ポインタの配列が作成されるためです。配列を指す方法

私はbindArrayFunction(&v);でc配列の最初の要素のメモリ位置を渡すことができると思いますが、どうすれば使用できますか?すべての頂点を得るために構造体のサイズだけポインタを増やすことはできますか?

ご意見やご感想をお寄せください。

答えて

2

は、CおよびC++では、配列は値渡し決してあります。

void f(int a[])のように)関数の宣言に配列型が現れると、型は暗黙的に(void f(int* a)のように)対応するポインタ型に変換されます。

ほとんどの式で配列の名前を使用すると、その配列の最初の要素へのポインタに暗黙的に変換されます。したがって、int v[100]を指定すると、f(v)を呼び出すと、vという初期要素へのポインタが渡されます。 (暗黙の変換にはいくつかの例外があります。特に、配列がsizeofオペランドまたは単精度&オペレータの場合)。

ポインタの算術演算は、常にポイント先の要素のサイズで行われます。したがって、v + 1が与えられた場合、配列vは暗黙的にその最初の要素へのポインタ(&v[0]と等価)に変換され、v[1]を指すようにsizeof(int)バイトだけインクリメントされます。

0

ほとんどの状況では、配列は、最初の要素へのポインタにを崩壊させます。

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

これら2つのコールが同一である:あなたが機能を持っているのであれば、両方の場合

int array[10]; 

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

、単一のポインタは配列全体にアクセスするための機能をできるように、関数に渡されます。

1

ちょうどそれが配列であるかのように参照してください。

void bindArrayFunction(Vertices *v, int size) { 
    for (int i = 0; i < size; ++i) { 
    process(v[i]); 
    } 
} 
関連する問題