一次元配列
int a[] = {
1,2,3,4};
1:printf("%d\n",sizeof(a));
2:printf("%d\n",sizeof(a+0));
3:printf("%d\n",sizeof(*a));
4:printf("%d\n",sizeof(a+1));
5:printf("%d\n",sizeof(a[1]));
6:printf("%d\n",sizeof(&a));
7:printf("%d\n",sizeof(*&a));
8:printf("%d\n",sizeof(&a+1));
9:printf("%d\n",sizeof(&a[0]));
10:printf("%d\n",sizeof(&a[0]+1));
例1
int a[] = {
1,2,3,4};
printf("%d\n",sizeof(a));
ここでのaは配列全体を表し、配列全体のサイズが計算されるため、結果は
4 (配列要素) * 4 (int 型が占めるサイズ) = 16 となります。
例 2
int a[] = {
1,2,3,4};
printf("%d\n",sizeof(a+0));
ここで、 a+0 の a は配列全体ではなく、最初の要素のアドレスであることに注意してください。配列名が sizeof() 括弧内に単独で存在する場合にのみ、配列全体を表すため
です。sizeof() 括弧内だけでは、配列全体を表します。配列の最初の要素のアドレスのみを表します。この 2 つのアドレスは同じですが、本質的には異なります。したがって、a+0 は実際には &a です。 [0]、&a[0] のサイズは 4 または 8 バイトです。なぜここに a があるのですか? +0!=a[0]? a+0 は本質的にアドレスであり、a[0] は要素であるためです。アドレスではなく配列なので、*(a+0) のみが a[0] と等しくなります。
例 3
int a[] = {
1,2,3,4};
printf("%d\n",sizeof(*a));
* a は配列の最初の要素、つまり * a=a[0]、sizeof(a[0])=4 (整数型のサイズ)
例 4
int a[] = {
1,2,3,4};
printf("%d\n",sizeof(a+1));
この質問は実際には例 2 と基本的に同じです。a+1 は、配列の最初の要素のアドレスが 1 ビット戻ることを意味します。つまり、a+1=a[1] なので、sizeof の結果になります。 (a+1) それは 4 または 8 バイトです。
ここで a が最初の要素のアドレスであることがわかっているので、実際にはここで直接答えを得ることができます。つまり、a+1 はまだアドレスであるため、アドレスのサイズは4 バイトまたは 8 バイトです。
例5
int a[] = {
1,2,3,4};
printf("%d\n",sizeof(a[1]);
2番目の要素のサイズは4バイト(int型のサイズ)となる計算です。
例6
int a[] = {
1,2,3,4};
printf("%d\n",sizeof(&a));
&a は以前のブログの 1 つで、配列全体のアドレスを取得する方法は 2 つしかない、1 つは sizeof (配列名)、もう 1 つは & (配列名) であると述べました。したがって、**&
a は配列全体のアドレスになります。配列アドレス、これはアドレスであるため、結果は依然として 4 または 8 バイトです**
例 7
int a[] = {
1,2,3,4};
printf("%d\n",sizeof(*&a));
ここで、**&a は配列全体のアドレス**、* は配列全体を逆参照するため、sizeof( *&a) は配列全体の計算されたサイズであるため、結果は 16 になります。
例8
int a[] = {
1,2,3,4};
printf("%d\n",sizeof(&a+1));
&a は配列全体のアドレスを表します。ここでの +1 は、配列の最初の要素のアドレスを次の桁に移動するのではなく、配列全体を直接スキップします。これは配列のアドレスなので、4 のままです
。または8バイト。
例9
int a[] = {
1,2,3,4};
printf("%d\n",sizeof(&a[0]));
&a[0] は配列の最初の要素のアドレスなので、サイズは 4 または 8 バイトです。
例 10
int a[] = {
1,2,3,4};
printf("%d\n",sizeof(&a[0]+1));
前の質問で述べたように、最初の要素のアドレスなので、ここでの +1 は次の要素にジャンプするためのアドレス、&a[0]+1=&a[1]、サイズは 4 または 8 バイトです
出力結果の例
文字配列 1
char arr[] = "abcdef";
1:printf("%d\n", sizeof(arr));
2:printf("%d\n", sizeof(arr+0));
3:printf("%d\n", sizeof(*arr));
4:printf("%d\n", sizeof(arr[1]));
5:printf("%d\n", sizeof(&arr));
6:printf("%d\n", sizeof(&arr+1));
7:printf("%d\n", sizeof(&arr[0]+1));
例1
char arr[] = "abcdef";
1:printf("%d\n", sizeof(arr));
sizeof は配列内のメモリ サイズのみを計算し、文字列は文字 'a' 'b' 'c' ' d' 'e' 'f' '\0' で構成され、1 文字のサイズが 1 ワードであるためです。したがって、最終的な出力結果は
7 (文字列内の文字数) * 1 (1 文字のメモリ サイズ) = 7 となります。
例 2
char arr[] = "abcdef";
1:printf("%d\n", sizeof(arr+0));
arr+0 前に、ここでの arr は配列全体のアドレスではなく、最初の要素のアドレスであると述べました。つまり、arr+0=arr[0]、これはアドレスなので、結果は 4 または 8 になります。
例 3
char arr[] = "abcdef";
1:printf("%d\n", sizeof(*arr));
arr は配列の最初の要素のアドレスです。逆参照 arr は配列の最初の文字 a です。char 型なので、結果は 1 になります。
例 4
char arr[] = "abcdef";
1:printf("%d\n", sizeof(arr[1]));
ここで探しているのは 2 番目の文字 b なので、結果は 1 になります。
例5
char arr[] = "abcdef";
1:printf("%d\n", sizeof(&arr));
&arr は配列全体のアドレスなので、アドレスなので結果は 4 または 8 になります。
例6
char arr[] = "abcdef";
1:printf("%d\n", sizeof(&arr+1));
&arr+1 は配列全体をスキップしますが、それでもアドレスであるため、4 または 8 のままです。
例 7
char arr[] = "abcdef";
1:printf("%d\n", sizeof(arr[0]+1));
arr[0]+1 は 1 つの要素をスキップするため、arr[1] になりますが、それでもアドレスであるため、4 または 8 になります。