0

次の C コードの機能を正確に説明してくれる人はいますか? 特に最初の行と繰り返される行は?

int * p = &my_numbers[0];

int i;
int j = 0;

for (i = 0; i < 6; i++)
{
  j += *(p + (i));
}

コンパイラ (GCC) は、イテレータをインクリメントするとき、1 バイトではなく sizeof(int) / 4 バイトであることを認識していますか? これはすべてのコンパイラで同じですか? もともと私は使用していました:

  j += *(p + (i * sizeof(int)));

しかし、それは間違った答えを出しました:

  j += *(p + (i));

正しい答えを出しました。

1バイトだけインクリメントしたい場合、何を書かなければなりませんか? (なぜこれをやりたいのかわかりません。言語の強く型付けされた性質により、charを使用してコンパイラに伝えることができるのではないでしょうか?)

4

5 に答える 5

1

はい。ポインター演算では、ポインターは、指す型のサイズによって調整されます。

1 バイトのポインター演算が必要な場合は、char*and キャストを使用する必要があります。intしかし、実際にsを扱っている場合は、アライメントの問題に遭遇する可能性があります。

于 2013-03-05T18:33:16.713 に答える
1

使ってから

int * p

コンパイラは、4 バイト離れた次のアドレスを見つける必要があることを認識しています。もしも

char * p

代わりに使用された場合、毎回 1 バイトの距離だけが追加されます。

初期コード

j += *(p + (i * sizeof(int)));

ポインタを指し示したいアドレスを過ぎて移動します。

于 2013-03-05T18:38:31.107 に答える
0

pはint型へのポインタであるため、その算術演算はint型に最適です。>ポインタがcharまたはvoidを指している場合、1バイトずつ増加します。

ボイドポインタを直接インクリメントすることはできません。インクリメントするには、char、byteなどにキャストする必要があります。

于 2013-03-05T18:42:04.783 に答える
0

p はint型へのポインターであるため、その算術演算は型に最適ですint。ポインターが指している場合は、charだけインクリメントされ1 byteます。

于 2013-03-05T18:33:03.107 に答える
0

ポインター演算では、ポイント先の型のサイズが考慮されます。pointer が指定されるT *pと、式は次の型の'th要素*(p + i)のアドレスを計算し、それを逆参照します。 iTp

于 2013-03-05T18:49:28.583 に答える