2012-04-24 7 views
1

以下では、13が印刷されると予想していました。
intである1つの配列メンバーのサイズで、arr(配列のint値が格納されているメモリへのポインタです)を移動したかったのです。C++はポインタを移動して配列をナビゲートします

代わりに45が印刷されます。したがって、配列メンバー全体のジャンプを1つ作成する代わりに、5番目の配列メンバーが取得されます。どうして?

int arr[] = {1,13,25,37,45,56}; 
int val = *(arr + 4);   //moving the pointer by the sizeof(int)=4 
std::cout << "Array Val: " << val << std::endl; 
+0

これは、配列の標準ポインタ演算の動作に関係します。詳細はこちら[こちら](http://www.tutorialspoint.com/cprogramming/c_pointer_arithmetic.htm) – RBT

答えて

8

あなたの前提は間違っています。 4バイト先ではなく、先にポインタ4要素を移動します。

*(arr + 4)は、そのロジックでは*(arr + 4 * sizeof (arr [0]))と言っているようです。

*(arr + 4)の文はarr [4]に相当します。しかし、*(4 + arr)も同様に有効です。意味は4 [arr]です。

あなたの行動は、次の例を通じて達成することができます

#include <iostream> 

int main() 
{ 
    int a[3] = {65,66,67}; 
    char *b = reinterpret_cast<char *>(a); 
    std::cout << *(b + sizeof (int)); //prints 'B' 
} 

でも、私は、この目的のためにreinterpret_castを使用してお勧めしません。

+0

これは構文ですか? '(arr + x)'は配列にアクセスしますか?どうすればメモリアドレスを変更できますか? – Skip

+0

'arr + x '部分はポインタ算術規則の一部です。 'arr + 1'は、' arr'が指す型の次の要素に進みます。 – chris

+0

aha - これはわかった。そして、ポインタの型が 'void *'ならばどうなりますか? – Skip

4

arr + 4は、4バイトではなく、配列の先頭アドレスから4つの項目を表示します。だからこそ、0番目のアイテムに4を加えた45が得られるのです。

0

ポインタ演算を実行しています。 http://www.eskimo.com/~scs/cclass/notes/sx10b.html

arrあなたの配列であり、これはあなたがそれが今45を指している4つの要素arr[4]でポインタを移動することに+ 4、その後、1になります最初の要素arr[0]に分解する:これは参照してください。

+0

それで5になるはずですか? 4とfirst_array_element(1)は5になるはずですから? – Skip

+0

@Skipいいえ、あなたの配列はintで構成されています。ポインタをインクリメントして次の要素に移動しているときは、最初の要素の値に4を加えていません。 'int val =(* arr)+ 4;'これは、1である最初の要素を逆参照してから5を生成し、4を追加すると、4つの位置でポインタをインクリメントすることです – EdChum

関連する問題