重複の可能性:
ポインターのインクリメントに関する質問
int ポインターをインクリメントすると、そのアドレスには 4 バイトのギャップがあります。なぜそうなのですか?char は 2 バイトかかるのに、なぜ int ポインターは格納に 4 バイトかかるのですか?
型 A のポインターをインクリメントすると、ポインターが指す型のサイズだけメモリ内でそのポインターが前方に移動します。あなたのマシンでは、int は 4 バイトかかるので、ポインターは 4 バイト移動します。
「なぜint
私のマシンで4バイトかかるのですか?」について:
C++ 標準は次のように述べています (4.9.1. 段落 2):
標準の符号付き整数型には、「signed char」、「short int」、「int」、「long int」、および「long long int」の 5 つがあります。このリストでは、各タイプは、少なくともリスト内の前のタイプと同じ量のストレージを提供します。<...> プレーン int は、実行環境のアーキテクチャによって提案された自然なサイズを持ちます[44]。その他の符号付き整数型は、特別なニーズを満たすために提供されています。
[44] : つまり、ヘッダーで定義されているように、INT_MIN と INT_MAX の範囲内の任意の値を含めるのに十分な大きさです。
基本的に、基本型のサイズは決まったものではなく、実装によって定義されます。このSOの質問に対する受け入れられた回答には、それに関する情報が含まれています。
一般的なルールは次のとおりです。
タイプが の場合T
、そのサイズはバイト単位N
で計算されます。sizeof(T)
したがって、ポインタをだけインクリメントすると、型のポインタはバイト単位T*
で増加します。N
1
数学的には、
T *p = getT();
size_t diff = static_cast<size_t>(p+1) - static_cast<size_t>(p);
bool alwaysTrue = (diff == sizeof(T)); //alwaysTrue is always true!
データ型へのポインタのサイズは、システムでサポートされているものと常に同じです
システムが 32 ビットの場合、すべてのポインターのサイズは 4 バイトになります。
ポインター演算では、このポインターが指すデータ型のサイズに応じて増減が行われptr++
ます。ptr--
ptr
char *cptr;
int *iptr;
char c[5];
int a[5];
cptr=c;
iptr=a;
そうcptr++
することc[1]
で、ポインタが1バイトだけインクリメントされ、各文字のアドレスを確認できます。
同様iptr++
に、a[1]
ポインタが 4 バイト増加します。
int main()
{
int i;
for(i=0;i<5;i++)
{
printf("%p\t",&c[i]); //internally pointer arithmeitc: (c+sizeof(char)*i) ,
printf("%p\n",&a[i]); //intenally pointer arithmetic : (a+sizeof(int)*i)
}
}
またはその他のデータ型のサイズint
は実装定義です
お使いのコンピュータではsizeof (int) == 4
、あるものint
から次のものに進むには 4 バイトのインクリメントが必要なためです。
ほとんどの整数型は、コンピューターによってサイズが異なります。int
少なくとも 16 ビットが必要であり、コンピューターの「自然な」サイズであると想定されています。ほとんどの 32 ビットまたは 64 ビット プラットフォームは、「自然な」サイズとして 32 ビットを選択します。また、ほとんどのコンピュータは 8 ビット バイトを使用するため、4 バイトはint
.
ただし、sizeof (char) == 1
すべてのコンピューターで、「1文字が2バイトかかる」と言うのにはかなり驚いています。必要なのは 1 つだけです。
ポインタが指しているデータ(int)のサイズは4バイトであるため、ポインタは4バイト増加します(データ(int)のサイズ)
別の例: サイズが 8 バイトの構造体があり、この構造体を指すポインターがある場合、このポインターの増分は 8 バイトになります。
struct test {
int x;
int y;
}
struct test ARRAY[50];
struct test *p=ARRAY; // p pointer is pointing here to the first element ARRAY[0]. ARRAY[0] is with size 8 bytes
p++; // this will increment p with 8 byte (size of struct test). So p now is pointing to the second element ARRAY[1]
ポインターは、ポインターが指すもののサイズ (バイト単位) だけインクリメントします。int は、32 ビット マシンでは 4 バイトを使用します。