0

さて、テストで私はこの質問をしました:

int* ptrA;    // assigned memory address 100
int a = 1;    // assigned memory address 600
ptrA = &a;

What is the memory address of ptrA + 2?

私はそれが606だと思った(int4バイト+アドレスaは600 + 2 = 606ですが、どうやら答えは608でした、これを実現するために何が欠けていますか?

4

6 に答える 6

5

これは未定義の動作です。式PtrA + 2は不正です。所有しているポインターに対してのみポインター演算を行うことができ、所有している配列の範囲外または範囲外のポインターを加算または減算することはできません。

ただし、これを分析することはできます (ただし、UB のため役に立ちません)。aあなたは のアドレスが であると仮定しますが、そうでは600 + 2なく、おそらくsizeof(int*)4であるため、これは になり600 + 4ます。だからあなたは得る600 + 4 + 4 = 608

于 2012-10-10T04:40:34.680 に答える
3

実際、ポインターの算術演算は異なります。それらの増加はデータ型のサイズに依存するため、1 つのアドレスが指定されている場合、x と言うと、u は x+ 2 を要求する必要があります.. (x が整数ポインタである場合) ..

x+ 2 は ---- x + (sizeof(int))*2 を意味します

x が char ポインタとして与えられた場合

x+2 は ---- x + (sizeof(char))*2 を意味します

ありがとう。

于 2012-10-10T04:48:02.487 に答える
1

C ではx + yxポインターは と同等&x[y]です。あなたが持っていたと仮定します

int abc[3] = {1,2,3}; 
int* ptr = &abc[0];

&ptr[2]( ptr + 2) は のアドレスであり3、明らかに のアドレスよりも 8 つ多くなっています1

于 2012-10-10T04:53:20.727 に答える
1
int* PtrA;    // assigned memory address 100
int a = 1;    // assigned memory address 600

What is the memory address of ptrA + 2? 

質問があいまいです。

質問が「(ptrA のメモリ アドレス) + 2 とptrAは?」である場合、メモリ アドレス 100 (PtrA != ptrA を無視) にあり、C および C++ でポインターに 2 を追加すると、指す型のサイズの倍数なので、intが 32 ビットの場合、最終結果は 100 + 2 * 4 = 108 になります。

質問が「(ptrA + 2) のメモリ アドレスは何ですか?」、つまり、ptrA 変数と 2 の値を加算した結果である場合、それは未定義ですptrA。初期化されていないメモリから読み取ります。

あなたの期待と想定される答えは、意図したコードが...

ptrA = &a;

...ptrA + 2評価される前のいつか。それが本当なら、答えは で600 + 2 * sizeof(int)、608 である可能性が非常に高いです。

于 2012-10-10T04:58:35.787 に答える
0

C/C++ では、ポインター演算は、ポインターが指しているオブジェクトのサイズを使用します。元:

int* PtrA = (int*)600;

PtrA+2整数のサイズが 4 の場合、 の値は608 になります。

標準では、配列内または「配列の直後」でのみポインター演算を実行できます。これは、一定の注意を払う必要があることを意味します。

于 2012-10-10T04:44:31.853 に答える
0

アドレスが常に多くなるというのは真実ではないと思います。それも少なくなる可能性があります。確かなことは、ptr が整数の配列 a のベースアドレスへのポインタであるとすると、ptr+2 は配列の 3 番目の要素を指すということです。したがって、配列のベースアドレスが 600 の場合、アドレスは 600+2*(sizeofIint)) または 600-2*sizeof(int) になります。しかし、いずれにしても、その配列の 3 番目の要素を指します。したがって、配列の場合でも、直接アドレスに依存するべきではないと思います。ptr+2 が 608 を指すか、それ以外を指すかについて、いかなる仮定もすべきではありません。

よろしくお願いします、 サウラブ

于 2012-10-10T05:05:18.377 に答える