1

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

代わりに 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;
4

3 に答える 3

10

あなたの仮定は間違っています。ポインターを 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ただし、この目的での使用はお勧めしません。

于 2012-04-24T22:09:30.170 に答える
4

arr + 44バイトではなく、配列の開始アドレスから4つのアイテムが得られます。そのため、0 番目の項目に 4 を加えた 45 が得られます。

于 2012-04-24T22:10:58.100 に答える
0

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

arrarr[0]はあなたの配列であり、これは になる最初の要素に分解され1、次に+ 4ポインタを4要素移動するarr[4]ので、 を指してい45ます。

于 2012-04-24T22:11:31.283 に答える