1. ホーム
  2. c

[解決済み】なぜC言語では配列のアドレスと値が等しくなるのか?

2022-04-08 17:34:48

質問

次のコードでは、ポインタの値とポインタのアドレスは予想通り異なっています。

しかし、配列の値とアドレスはそうではありません。

どうしてそうなるのでしょうか?

出力

my_array = 0022FF00
&my_array = 0022FF00
pointer_to_array = 0022FF00
&pointer_to_array = 0022FEFC

#include <stdio.h>

int main()
{
  char my_array[100] = "some cool string";
  printf("my_array = %p\n", my_array);
  printf("&my_array = %p\n", &my_array);

  char *pointer_to_array = my_array;
  printf("pointer_to_array = %p\n", pointer_to_array);
  printf("&pointer_to_array = %p\n", &pointer_to_array);

  printf("Press ENTER to continue...\n");
  getchar();
  return 0;
}

解決方法は?

配列の名前は通常、その配列の最初の要素のアドレスとして評価されます。 array&array は同じ値を持つ(しかし型は異なるので array+1&array+1 意志 ない は、配列の長さが1要素以上である場合に等しくなります)。

例外は2つあり、配列名が sizeof または単項 & (Address-of)の場合、名前は配列オブジェクト自身を指します。 したがって sizeof array は、ポインタのサイズではなく、配列全体のサイズをバイト数で表します。

として定義された配列の場合 T array[size] という型になります。 T * . これをインクリメントすると、配列の次の要素に到達します。

&array は同じアドレスに評価されますが、同じ定義が与えられると、このポインタは T(*)[size] -- つまり、1つの要素ではなく、配列へのポインタです。このポインタをインクリメントすると、1つの要素のサイズではなく、配列全体のサイズが追加されます。たとえば、次のようなコードである。

char array[16];
printf("%p\t%p", (void*)&array, (void*)(&array+1));

2番目のポインタは1番目のポインタより16大きいことが予想されます(16個のcharの配列だからです)。pは通常16進数でポインタを変換するので、次のようになります。

0x12341000    0x12341010