[C言語 - 配列におけるさまざまな型のポインタの役割]

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 バイトです。

 

おすすめ

転載: blog.csdn.net/ggbb_4/article/details/129326918