2011-01-23 8 views
7

http://www.fredosaurus.com/notes-cpp/arrayptr/26arraysaspointers.htmlC++ - ポインタの追加や要素サイズで

の下で:ポインタ加算と要素サイズ

次のコードがあります:に "P" をどうやっ

// Assume sizeof(int) is 4. 
int b[100]; // b is an array of 100 ints. 
int* p;  // p is a a pointer to an int. 
p = b;  // Assigns address of first element of b. Ie, &b[0] 
p = p + 1; // Adds 4 to p (4 == 1 * sizeof(int)). Ie, &b[1] 

最後の行は「4」になりますか?

ありがとうございました。

+0

注によってシフトされる尖った型のサイズを知っているし、適切な値で

を、それをシフト32/64-bitシステムのsizeof(int)は4です。しかし、よりエキゾチックなプラットフォームでは、何でもかまいません。したがって、 "sizeof(int)は4であると仮定します"というコメントです。 –

+0

実際には難解なシステムではありません。私はArduinoのプロセッサーはsizeof(int)が2だと思います。 – Falmarri

答えて

11

(私は「P」、あなたは最後の行に「1」を意味することをないと仮定)

ポインタ演算は論理加え、ない数値追加です。 1つをポインタに追加するということは、「このオブジェクトの直後にあるオブジェクトへのポインタを生成する」ことを意味します。つまり、ポインターをインクリメントしているオブジェクトのサイズによってコンパイラーが自動的にスケールします。これにより、オブジェクトの真ん中にポインタが置かれたり、ポインタの位置がずれることがありません。

+0

ご返信ありがとうございます。あなたが言うときは: "コンパイラは、ポインタをインクリメントしているオブジェクトの大きさを指し示していても自動的にスケールすることを意味します。" eに "1"を追加すると、例えば、これはポインタをメモリの後に来るオブジェクトに合わせて縮尺することを意味します。これで十分ではありませんか?なぜデータ型のサイズで乗算するのですか?ありがとう。 – Simplicity

+0

@ SWEngineer-私の謝罪、私は非常に明確ではなかった。 *ポインタ*はスケーリングされません。ポインタがインクリメントされる量はインクリメントされます。そのようにして、 'ptr + 1 'を書くことは、「ポインタのメモリアドレスと、指し示されているオブジェクトのサイズの1倍」を意味します。 – templatetypedef

+0

これは問題ありません。心配しないでください。ご清聴ありがとうございます。ここでは小さなことですが、なぜsizeof(データ型)に増分数(つまり1)を掛けなければならないと思いますか? C++がどのように設計されているのか、それとも論理的な理由があるのでしょうか?ありがとう。 – Simplicity

3

あなたが投稿するコードのコメントでは、ポインタに整数xを加算すると、ポインターの値がxを指し示すタイプのサイズで乗算されます。

これは、通常、ポインタを小さな増分で変更するのは意味がありません。これは、要素の1つの中央にポインタを置かないようにするためです。 CおよびC++の両方で

+0

結果の "4"の値は、そのコードサンプルで発生した可能性のある無数の無数の値の1つにすぎません。言い換えれば、pが指すメモリ領域に含まれる整数値は単純に...未定義です。 – Frunsi

1

pはサイズが4バイトの型へのポインタであるためです。ポインタ上の+演算子は実際にはポインタシフトです。コンパイラは、あなたがshortintを変更した場合、pはそれはそれは現代の最も上だけのことは常に4でないことを2バイト

関連する問題