1. 異なる型のポインターが同じスペースを占有します。
ポインタにはさまざまな種類があり、さまざまな種類のポインタが占めるスペースを計算すると、すべて 4 バイトを占めることがわかりました。
char* p1;
int* p2;
short* p3;
float* p4;
printf("%d\n",sizeof(p1));//4
printf("%d\n", sizeof(p2));//4
printf("%d\n", sizeof(p3));//4
printf("%d\n", sizeof(p4));//4
2. ポインタのタイプによって逆参照の範囲が決まります。
まず変数を定義します: int a = 0x11223344; (補足: 4 桁のバイナリは 16 進数を表します。0x11223344 は合計 32 桁のバイナリで、4 バイトとみなすことができ、int 型で定義される変数は 4 です)バイト)
int a = 0x11223344;
次のようにメモリに保存されます。
データの下位バイトはメモリの下位アドレスに格納されます
データの上位バイトはメモリの上位アドレスに格納されます (リトルエンディアン モード)
[Char型ポインタ] 次に、変数aを指すchar型ポインタ変数を定義し、ポインタの逆参照を再代入します。
char* pa1 = &a;
*pa1 = 0x88;
結果出力:
つまり、char 型ポインタを使用して変数 a を再割り当てすると、最初のバイトのみが変更され、残りのバイトは変更されません。つまり、char 型ポインタはバイトを逆参照します。
[int 型ポインタ] a を指す int 型ポインタ変数を定義し、値を再代入します。
int * pa2 = &a;
*pa2 = 0x55667788;
このとき、4 バイトすべてが変換されるため、int 型のポインタを使用して 4 バイトを逆参照できます。
3. ポインタのタイプによって、ポインタのステップ サイズが決まります。
[char型ポインタ]
int c[10] = { 0 };
char* p = c;
int i = 0;
for (i = 0;i<10;i++)
{
*(p + i) = 1;
}
結果: 上の図からわかるように、40 バイトのメモリが割り当てられました。
char ポインタが各バイトを連続的に指しており、最初に最初のバイトを指し、次に値を割り当て、次に次のバイトを指し、次に値を割り当てていることがわかります。
[int 型ポインタ] int 型ポインタ変数を定義し、for ループで配列の要素を再割り当てします。
int c[10] = { 0 };
int* p = c;
int i = 0;
for (i = 0;i<10;i++)
{
*(p + i) = 1;
}
結果: 40 バイトのメモリが割り当てられていることがわかります。
割り当て結果:
ポインタは最初のバイトを指し、現在のアドレスから始まる連続する 4 バイトに値を割り当て、次にポインタは 5 番目のバイトを指し、次の連続する 4 バイトに値を割り当てていることがわかります。(下図のように赤い01だけが変わるわけではありません。実際には割り当ての処理が変わることになります)
01 00 00 00 はメモリに保存されます)
より鮮明に表示するには:
次のように c[] 配列を初期化し、ループ内で配列要素に値 5 を割り当てました。
int c[10] = { 0x11111111,0x22222222,0x33333333,0x44444444 };
int* p = c;
int i = 0;
for (i = 0;i<10;i++)
{
*(p + i) = 5;
}
結果: 最初の 4 バイトには、それぞれ 0x11111111、0x22222222、0x33333333、0x44444444 の値が割り当てられ、以下のデフォルトは 0 になります。
次に、最初の for ループ割り当てを入力します。
つまり、int ポインタは最初のアドレスを指しますが、逆参照範囲は連続した 4 バイトです。