1

重複の可能性:
ポインターのインクリメントに関する質問

int ポインターをインクリメントすると、そのアドレスには 4 バイトのギャップがあります。なぜそうなのですか?char は 2 バイトかかるのに、なぜ int ポインターは格納に 4 バイトかかるのですか?

4

6 に答える 6

6

型 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の質問に対する受け入れられた回答には、それに関する情報が含まれています。

于 2012-11-16T08:25:38.577 に答える
2

一般的なルールは次のとおりです。

  • タイプが の場合T、そのサイズはバイト単位Nで計算されます。sizeof(T)したがって、ポインタをだけインクリメントすると、型のポインタはバイト単位T*で増加します。N1

    数学的には、

    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!
    
于 2012-11-16T08:27:32.410 に答える
2

データ型へのポインタのサイズは、システムでサポートされているものと常に同じです

システムが 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は実装定義です

于 2012-11-16T08:24:35.400 に答える
1

お使いのコンピュータではsizeof (int) == 4、あるものintから次のものに進むには 4 バイトのインクリメントが必要なためです。

ほとんどの整数型は、コンピューターによってサイズが異なります。int少なくとも 16 ビットが必要であり、コンピューターの「自然な」サイズであると想定されています。ほとんどの 32 ビットまたは 64 ビット プラットフォームは、「自然な」サイズとして 32 ビットを選択します。また、ほとんどのコンピュータは 8 ビット バイトを使用するため、4 バイトはint.

ただし、sizeof (char) == 1すべてのコンピューターで、「1文字が2バイトかかる」と言うのにはかなり驚いています。必要なのは 1 つだけです。

于 2012-11-16T08:28:29.283 に答える
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]
于 2012-11-16T08:25:02.373 に答える
1

ポインターは、ポインターが指すもののサイズ (バイト単位) だけインクリメントします。int は、32 ビット マシンでは 4 バイトを使用します。

于 2012-11-16T08:25:20.543 に答える