さて、テストで私はこの質問をしました:
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でした、これを実現するために何が欠けていますか?
これは未定義の動作です。式PtrA + 2は不正です。所有しているポインターに対してのみポインター演算を行うことができ、所有している配列の範囲外または範囲外のポインターを加算または減算することはできません。
ただし、これを分析することはできます (ただし、UB のため役に立ちません)。aあなたは のアドレスが であると仮定しますが、そうでは600 + 2なく、おそらくsizeof(int*)も4であるため、これは になり600 + 4ます。だからあなたは得る600 + 4 + 4 = 608。
実際、ポインターの算術演算は異なります。それらの増加はデータ型のサイズに依存するため、1 つのアドレスが指定されている場合、x と言うと、u は x+ 2 を要求する必要があります.. (x が整数ポインタである場合) ..
x+ 2 は ---- x + (sizeof(int))*2 を意味します
x が char ポインタとして与えられた場合
x+2 は ---- x + (sizeof(char))*2 を意味します
ありがとう。
C ではx + y、xポインターは と同等&x[y]です。あなたが持っていたと仮定します
int abc[3] = {1,2,3};
int* ptr = &abc[0];
&ptr[2]( ptr + 2) は のアドレスであり3、明らかに のアドレスよりも 8 つ多くなっています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 である可能性が非常に高いです。
C/C++ では、ポインター演算は、ポインターが指しているオブジェクトのサイズを使用します。元:
int* PtrA = (int*)600;
PtrA+2整数のサイズが 4 の場合、 の値は608 になります。
標準では、配列内または「配列の直後」でのみポインター演算を実行できます。これは、一定の注意を払う必要があることを意味します。
アドレスが常に多くなるというのは真実ではないと思います。それも少なくなる可能性があります。確かなことは、ptr が整数の配列 a のベースアドレスへのポインタであるとすると、ptr+2 は配列の 3 番目の要素を指すということです。したがって、配列のベースアドレスが 600 の場合、アドレスは 600+2*(sizeofIint)) または 600-2*sizeof(int) になります。しかし、いずれにしても、その配列の 3 番目の要素を指します。したがって、配列の場合でも、直接アドレスに依存するべきではないと思います。ptr+2 が 608 を指すか、それ以外を指すかについて、いかなる仮定もすべきではありません。
よろしくお願いします、 サウラブ