2010-11-29 6 views
3

私はCプログラムを開発していますが、ポインタと配列に関する質問があります。配列要素のアドレスを取得する

私は、次の 配列 ポインタがあります。

GLuint *vboIds; 

そして、次の関数のプロトタイプ:

void glGenBuffers(GLsizei n, GLuint *buffers); 

次の文は正しいです:

glGenBuffers(1, vboIds); 

をしかし、私はしたいですglGenBuffersに2番目のインデックスを渡す関数の第2引数としてvboIdsを指定します。私はこれを入れました:

glGenBuffers(1, &&vboIds[1]); 

これは間違いありませんか?

ありがとうございました。

+3

"' 'GLuint * vboIds私は次の配列をしている" 演算子(&)の一つのアドレスを必要としています。配列!=ポインタを覚えておいてください。配列表記を使ったポインタを使った間接的な層があります。 – SiegeX

+0

@SiegeX:私は長年Cと仕事をしておらず、ほとんどすべてを忘れてしまった。 – VansFannel

+1

心配はいりませんが、これはCプログラマがしばしば間違っています。 "余分な間接層"を拡張するには、 'int foo [10];を宣言したと仮定します。 int * bar = foo; ' 'foo [2] = 1;'を実行すると、配列 'foo'のアドレスは既知の定数になり、値を取得するために' 2 * sizeof(int) 'がfooのアドレスに追加されます。一方、 'bar [2] = 1;'を実行すると、最初に起こることは 'bar'の値を取得し、その値を配列に渡してから' 2 * sizeof (int) 'を呼び出して値を取得します。 – SiegeX

答えて

5
glGenBuffers(1, &(vboIds[1])); 

またはアーメンが言った、ダブル&は間違っている、とコンパイルされません。あなたがその構文を使用したいならば、それはです:

glGenBuffers(1, &vboIds[1]); 

これはそれを行うための最も簡単な方法ですアルメンの答え、と完全に同等です。 **、あなたがポインタ**間違っ次いる;:

+0

vboIdsのアドレスに追加する1は、どのvboIdsのタイプでも有効です。そのタイプをGLfloatに変更すると、それは有効でしょうか? – VansFannel

+1

'GLUint'か' GLfloat'かにかかわらず、 'vboIds'が指す型のサイズに等しいバイト数を常に加えます。 –

+1

またはglGenBuffers(1、&(1 [vboIds])); :P – Nyan

1
glGenBuffers(1, vboIds + 1); 
3

はい、1つのアンパサンドを削除すると正しくなります。

glGenBuffers(1, vboIds + 1);と書くこともできます。

glGenBuffers(1, vboIds + 1); 
+0

なぜ-1?この答えは正しいようです。 +1あなたのため – SiegeX

+0

さて、私は10秒で修正した間違いをしました。その間に、誰かが私にdownvoteを与えました... – Simone

0

0

はあなただけ

glGenBuffers(1, &vboIds[1]); 
関連する問題