C言語の配列とポインタの筆記試験問題(1)(必読)

一次元配列

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 になります。

おすすめ

転載: blog.csdn.net/2301_79178723/article/details/132783725