2011-04-10 3 views
38

ポインタの値は変数のアドレスです。なぜint pointerの値が4バイト増加したのですか。intポインタが1増加した後になぜintポインタ '++'は1ではなく4だけインクリメントするのですか?

私の意見では、ポインタの値(変数のアドレス)はポインタの増分後に1バイトだけ増加すると思います。

テストコード:

int a = 1, *ptr; 
ptr = &a; 
printf("0x%X\n", ptr); 
ptr++; 
printf("0x%X\n", ptr); 

期待出力:

0xBF8D63B8 
0xBF8D63B9 

実際に出力:

0xBF8D63B8 
0xBF8D63BC 

EDIT

アン他の質問 - intが1つ1つを占める4バイトを訪問するには?

答えて

92

T*をインクリメントすると、sizeof(T)バイトが移動します。 これは、他の値を移動する意味がないためです。たとえば、サイズが4バイトのintを指している場合、4を足して4を足していくとどうなりますか?部分的にはintと他のデータが混在しています。


メモリでこれを考えてみましょう:私はそのポインタをインクリメントするとき

[↓  ] 
[...|0 1 2 3|0 1 2 3|...] 
[...|int |int |...] 

より理にかなって?この:

  [↓  ] 
[...|0 1 2 3|0 1 2 3|...] 
[...|int |int |...] 

またはこの:

 [↓  ] 
[...|0 1 2 3|0 1 2 3|...] 
[...|int |int |...] 

最後は実際にintの任意の並べ替えを指していません。 (。技術的には、それから、そのポインタを使用してUBです)

あなた本当にchar*をインクリメントし、1つのバイトを移動する場合:charのサイズは常に1です:

int i = 0; 
int* p = &i; 

char* c = (char*)p; 
char x = c[1]; // one byte into an int 

voidは不完全なタイプなので、void*をインクリメントすることはできません。ポインタ点がCHARする場合

+0

"' void *は不完全な型なので 'void *'をインクリメントすることはできません " - true、しかしgccは' void * 'を拡張子としてサポートしています(' char * 'のように扱います)。 –

+0

整数の場合はほとんど意味がありませんが、可変長構造の配列のような状況では完璧な意味があります(「パケットがいっぱいのバッファがあるので、CurrentPacketPointerを次のパケット")。 –

+0

"実際に1バイトを移動したい場合は、char *を増やしてください。charのサイズは常に1です。"いいえ、常に1つではありません。代わりに 'uint8_t'を使用してください。 – Winter

8

ポインタの増分は、指し示された型のサイズに基づいています。 INTは、これは2

によってその値を増加させる1ショート*インクリメント、ショートが2バイトである場合4.

によってその値を増加させる1 INT *をインクリメントし、4バイトである場合Cポインター演算の標準的な動作

+0

私は彼が理論的根拠を求めていると思う。 – GManNickG

+0

ポインタ算術の根拠は、pointee型のサイズの単位で常に機能することは間違いないでしょう。 –

+0

理由は*理由*です。 – GManNickG

1

インクリメント後、ポインタはメモリ内の次のintをポイントします。 intは4バイト幅であるため、4バイト増加します。一般に、T型へのポインタはsizeof(T)だけインクリメントします。

1

int pointerintを指しています。 intは通常4バイトを占めるため、ポインタをインクリメントすると、ポインタはメモリ内の "次の" intを指します。つまり、4バイト増加します。どのようなサイズのタイプでもこのように動作します。 Aと入力すると、A*がインクリメントされ、sizeof(A)だけインクリメントされます。

考えてみましょう - ポインタを1バイトだけ増やした場合、それはintの中央を指しているので、これが望まれる機会はないと思います。

この動作は、たとえば配列を反復処理するときに非常に快適です。

2

ポインタは、それらが指す型のサイズだけ増加され、pointer++は1234バイト構造体を指している場合、pointer++は1234

によってポインタをインクリメントし、1ポインタをインクリメントします

初めて会うのは紛らわしいかもしれませんが、実際にはそれは特別なプロセッサ機能ではありませんが、コンパイラは計算中に計算しますので、pointer+1と書くと、pointer + sizeof(*pointer)

関連する問題