11

関数にポインタを渡したい。このポインターが配列の途中の場所を指すようにします。そのような配列があるunsigned char BufferData[5000];とします。次のステートメントは構文的に正しいでしょうか?

writeSECTOR( destAddress, (char *)( BufferData + (int)(i * 512 )) );
// destAddress is of type unsigned long
// writeSECTOR prototype: int writeSECTOR ( unsigned long a, char * p );
// i is an int
4

7 に答える 7

18

それはできますが、それを作るだけです:

 writeSECTOR( destAddress, &BufferData[i * 512]);

( writeSECTOR は実際には unsigned char* を取るべきだと思われますが)

于 2010-10-06T13:08:35.870 に答える
8

ポインター演算は、理解するのが非常に簡単です。配列の最初の要素へのポインターがある場合、各要素のサイズに関係なく、p + 1 は 2 番目の要素を指し、以下同様です。したがって、int の配列または任意の構造 MyData を持っていたとしても、それは true を保持します。

MyData data[100];
MyData *p1 = data;;  // same as &data[0]
MyData *p2 = p1 + 1; // same as &data[1]
MyData *p3 = p2 + 1; // same as &data[2]
MyData *p4 = p2 - 1; // same as &data[0] again

配列が unsigned char の場合は、配列に入れたいバイト数のオフセットを追加するだけです。

unsigned char data[16384];
unsigned char *offset = data + 512; // same as &data[512]
*offset = 5; // same as data[512] = 5;

または、表記がわかりにくい場合は、上記のコメントに示されているように、いつでも参照できます。&data[512]

于 2010-10-06T13:14:21.720 に答える
8

あなたはただ行うことができますBufferData + i * 512。char*の算術+演算子は、整数値を追加すると char* を生成します。

于 2010-10-06T13:09:39.207 に答える
3

それはうまくいくはずです。C では、ポインターに整数を追加すると、ポインターが指す型を乗算した整数だけポインターが増加しますsizeof

于 2010-10-06T13:08:55.573 に答える
0

それはあなたが思うようにうまくいくはずです。Cのポインターは、R​​AM内の単なるアドレスであるため、メジャーでポインターをドリフトさせる可能性があります。

于 2010-10-06T13:43:53.443 に答える
0

問題ないように見えますが、コンパイラで試してみてください。

writeSECTOR( destAddress, &BufferData[i * 512] ); を使用できます。

于 2010-10-06T13:10:23.380 に答える
0

配列の i*512 番目の要素のアドレスを渡すようです。それがあなたがしたいことですか?

ただし、intへのキャストが何を購入しているのかはよくわかりません。

于 2010-10-06T13:11:18.810 に答える