C言語のポインタに関するいくつかのトピック(1)

最初に気付くのは:

1、&Array name、ここでの配列名も配列全体を表し、配列の最初の要素のアドレスではなく、配列のアドレスが取り出されます。この記事では、この2つの違いは繰り返されません。ご不明な点がございましたら、ご自身で情報を参照してください。

2.構文は次のように規定しています。sizeof(配列名)。配列名が1つしかない場合、sizeof(配列名)は配列全体のサイズを計算します。

3.上記の場合を除いて、すべての配列名は配列の最初の要素のアドレスです

4、sizeofは占有スペースのサイズのみに注意を払い、単位はバイトであり、sizeofはタイプに注意を払いません。sizeofは演算子です。

5.strlenが注目する文字列の\0までは、\0の前に表示される文字数を計算します。strlenポインタは文字列のライブラリ関数です。

6.メモリと区別を強化するために、配列の最初の要素のアドレス、配列のアドレスなどの重要なステートメントが含まれている限り、太字にすると同時に、それぞれの分析プロセスが書かれています。

1.次のステートメントによって出力される結果は何ですか?

//一维数组
int a[] = {1,2,3,4};

printf("%d\n",sizeof(a));//1
printf("%d\n",sizeof(a+0));//2
printf("%d\n",sizeof(*a));//3
printf("%d\n",sizeof(a+1));//4
printf("%d\n",sizeof(a[1]));//5
printf("%d\n",sizeof(&a));//6
printf("%d\n",sizeof(*&a));//7
printf("%d\n",sizeof(&a+1));//8
printf("%d\n",sizeof(&a[0]));//9
printf("%d\n",sizeof(&a[0]+1));//10

解析:

01 16.配列名aはsizeofのみの中に配置され、配列全体のサイズが計算され、サイズは4 * 4バイトです;(以下の単位はすべてバイトであり、省略されています)

02 4/8。(32ビットは上に4、64ビットは上に8、下の4/8にも同じです)配列名aは単独では配置されず、の最初の要素のアドレスを表します。配列であり、アドレスのサイズは4/8です。

03 4.aは単独は配置されず、配列の最初の要素のアドレスであり、要素1は*の後に取り出され、int型であり、サイズは4です。

04 4 / 8.aは単独は配置されず、配列の最初の要素のアドレスであり、+ 1では、配列の2番目の要素のアドレス2のアドレスであり、アドレスのサイズです。 4/8です。

05 4.aは単独は配置されません。これは配列の最初の要素のアドレスであり、 [1]は配列の2番目の要素であり、型はintであり、サイズは4です。

06 4/8. &Array name 、配列のアドレスを示します。配列のアドレスはアドレスでもあり、アドレスのサイズは4/8です。

07 16.(&)aのアドレスを*で取得します。これは、2つをキャンセルするのと同じです。または別のaです。配列名aは、sizeofだけの中に配置され、配列全体のサイズが計算され、サイズは4*4です。

08 4/8. &Array name 、配列のアドレスを示します。&a配列aのアドレスを取得します。+1で、配列a全体をスキップし、次のアドレスをポイントします。アドレスのサイズは4/8です。

09 4/8.優先度に注意してください!優先度[]>&(アドレス文字を取ります)。配列の最初の要素であるa [0]は、そのアドレスです。アドレスのサイズは4/です。 8;

10 04/8.優先度に注意してください!Priority []>&(アドレス文字を取ります)。配列の最初の要素であるa [0]は、&がそのアドレスであり、1を加算するとアドレスになります。配列の2番目の要素のアドレス(データ型は、1を加算することによってポインターが移動できる長さを決定します。これはint型であり、1を加算すると2番目の要素に4バイトスキップされます)。アドレスのサイズは4です。 / 8;

2.次の各ステートメントによって出力される結果は何ですか?

//字符数组
char arr[] = {'a','b','c','d','e','f'};

printf("%d\n", sizeof(arr));//1
printf("%d\n", sizeof(arr+0));//2
printf("%d\n", sizeof(*arr));//3
printf("%d\n", sizeof(arr[1]));//4
printf("%d\n", sizeof(&arr));//5
printf("%d\n", sizeof(&arr+1));//6
printf("%d\n", sizeof(&arr[0]+1));//7
printf("%d\n", strlen(arr));//8
printf("%d\n", strlen(arr+0));//9
printf("%d\n", strlen(*arr));//10//运行时需要注释掉
printf("%d\n", strlen(arr[1]));//11//运行时需要注释掉
printf("%d\n", strlen(&arr));//12
printf("%d\n", strlen(&arr+1));//13
printf("%d\n", strlen(&arr[0]+1));//14

解析:

01 6.配列名arrはsizeofだけの中に配置され、配列全体のサイズが計算され、サイズは1 * 6バイトです。ここでは文字列ではなく、単なる文字配列です。

02 4/8.配列名arrは単独では配置されず、配列の最初の要素のアドレスを表し、 + 0の場合、効果はありません。アドレスのサイズは4/8です。

03 1.配列名arrは単独では配置されず、配列の最初の要素のアドレスを表します。*では、この要素が取得されます。charタイプのサイズは1です。

04 1.配列名arrは単独では配置されず、2番目の要素である配列の最初の要素のアドレスを表します。char型のサイズは1です。

05 4/8. &Array name 、配列のアドレスを示します。配列のアドレスはアドレスでもあり、アドレスのサイズは4/8です。

06 4/8. &Array nameは、配列のアドレスを示します。&arrは、配列arrのアドレスを取得します。+1で、配列arr全体をスキップし、次のアドレスを指します。アドレスのサイズは4/8です。

 07 04/8.優先度に注意してください!Priority []>&(アドレス文字を取得)。arr[0]は配列の最初の要素であり、&はそのアドレスであり、1を加算するとアドレスになります。配列の2番目の要素のアドレス(データ型は、1を追加することによってポインターが移動できる長さを決定します。これはchar型であり、1を追加すると2番目の要素に1バイトスキップします)。アドレスのサイズは4/です。 8;

08ランダムな値。配列名arrは単独では配置されず、配列の最初の要素のアドレスを表します。strlen関数はこのアドレスから続行します。文字配列に「\ 0」がないため、その結果、いつ停止するかわかりません。したがって、異なるコンピューターで計算された結果は異なります。strlenは、「\0」に遭遇すると停止します。

09ランダムな値。配列名arrは単独では配置されません。これは、配列の最初の要素のアドレスを表します。+ 0でも、この要素のアドレスです。strlen関数は、このアドレスから続行します。文字配列に「\0」がないため、いつ停止するかわからないため、異なるコンピュータで計算された結果は異なります。strlenは「\0」に遭遇すると停止します。

10エラー。配列名arrは単独では配置されず、配列の最初の要素のアドレスを表します。*では、要素'a'が取得されます。文字がメモリに格納されると、ASCIIコード、 'a'は97.strlen関数です。引き続き97をアドレスとして使用すると、アクセスメモリの競合が発生します。

11エラー。配列名arrは単独では配置されず、配列の最初の要素arr [1]のアドレスを表し、要素'b'が取得されます。文字がメモリに格納されると、 ASCIIコード、「b」は98です。strlen関数はアドレスとして98を使用してウォークを続行し、その結果、アクセスメモリの競合が発生します。

12ランダム値。&Arrayname 、配列のアドレスを示します。タイプはstrlenのパラメータータイプとは異なりますが、パラメーターが渡された後も、'がないため、最初の文字のアドレスから計算されます。文字配列の\0'の場合、いつ停止するかわからないため、異なるコンピューターで計算された結果は異なります。strlenは'\0'に遭遇すると停止します。

13        ランダム値。&Arrayname 、配列のアドレスを示します。ただし、タイプはstrlenのパラメータータイプとは異なりますが、パラメーターが渡された後、+ 1、この文字配列をスキップして計算を開始します。後者はそうではないためです。 '\ 0'の位置を知っていると、いつ停止するかわからないという結果になります。したがって、異なるコンピューターで計算された結果は異なります。strlenは'\0'に遭遇すると停止します。

14ランダムな値。優先度に注意してください!Priority []>&(アドレス文字を取ります)。配列の最初の要素であるarr [0]は、&がそのアドレスであり、1を加算するとアドレスになります。配列アドレスの2番目の要素(データ型は、1を追加することでポインターが移動できる時間を決定します。これはchar型であり、1を追加すると2番目の要素に1バイトスキップします)。ただし、型はstrlenのパラメーター型とは異なります。 、ただしパラメータは渡されます過去以降、2番目の文字のアドレスから計算が開始されます。文字配列に「\ 0」がないため、いつ停止するかわからないため、計算が行われます。結果はコンピュータによって異なります。「\0」まで停止します。

char arr[] = "abcdef";

printf("%d\n", sizeof(arr));//1
printf("%d\n", sizeof(arr+0));//2
printf("%d\n", sizeof(*arr));//3
printf("%d\n", sizeof(arr[1]));//4
printf("%d\n", sizeof(&arr));//5
printf("%d\n", sizeof(&arr+1));//6
printf("%d\n", sizeof(&arr[0]+1));//7
printf("%d\n", strlen(arr));//8
printf("%d\n", strlen(arr+0));//9
printf("%d\n", strlen(*arr));//10//运行时需要注释掉
printf("%d\n", strlen(arr[1]));//11//运行时需要注释掉
printf("%d\n", strlen(&arr));//12
printf("%d\n", strlen(&arr+1));//13
printf("%d\n", strlen(&arr[0]+1));//14

解析:

ここでのarr配列は文字列を表します。

01 7.配列名arrはsizeofのみの中に配置され、文字列全体のサイズ+'\ 0'が計算され、サイズは1*7バイトです。

02 4/8.配列名arrは単独では配置されず、配列の最初の要素のアドレスを表し、 + 0の場合、効果はありません。アドレスのサイズは4/8です。

03 1.配列名arrは単独では配置されず、配列の最初の要素のアドレスを表します。*では、この要素が取得されます。charタイプのサイズは1です。

04 1.配列名arrは単独では配置されず、2番目の要素である配列の最初の要素のアドレスを表します。char型のサイズは1です。

05 4/8. &Array name 、配列のアドレスを示します。配列のアドレスはアドレスでもあり、アドレスのサイズは4/8です。

06 4/8. &Array nameは、配列のアドレスを示します。&arrは、配列arrのアドレスを取得します。+1で、配列arr全体をスキップし、次のアドレスを指します。アドレスのサイズは4/8です。

 07 4/8.優先度に注意してください!Priority []>&(アドレス文字を取ります)。arr[0]は配列の最初の要素であり、&はそのアドレスであり、1を加算するとアドレスになります。配列の2番目の要素のアドレス(データ型は、1を追加することでポインターが移動できる長さを決定します。これはchar型であり、1を追加すると2番目の要素に1バイトスキップされます)。アドレスのサイズは4です。 / 8;

08 6.配列名arrは単独では配置されず、配列の最初の要素のアドレスを表します。strlen関数はこのアドレスから続行します。文字列の最後に「\ 0」が追加されるため、サイズを計算できます。strlenの遭遇'\0'は停止します。

09 6.配列名arrは単独では配置されず、配列の最初の要素のアドレスを表します。arrは+0、つまりこのアドレスにあります。strlen関数はこのアドレスから続行します。'\0以降'は文字列の最後に追加されます。サイズを計算できます。strlenは'\0'に遭遇すると停止します。

10エラー。配列名arrは単独では配置されず、配列の最初の要素のアドレスを表します。*では、要素'a'が取得されます。文字がメモリに格納されると、ASCIIコード、 'a'は97.strlen関数です。引き続き97をアドレスとして使用すると、アクセスメモリの競合が発生します。

11エラー。配列名arrは単独では配置されず、配列の最初の要素arr [1]のアドレスを表し、要素'b'が取得されます。文字がメモリに格納されると、 ASCIIコード、「b」は98です。strlen関数はアドレスとして98を使用してウォークを続行し、その結果、アクセスメモリの競合が発生します。

12 6. &Array name 、配列のアドレスを示します。タイプはstrlenのパラメータータイプとは異なりますが、パラメーターが渡された後も、最初の文字のアドレスから計算を開始し、strlen関数が開始します。文字列の最後に「\0」が追加され、サイズを計算できるため、このアドレスから続行します。strlenは「\0」に遭遇すると停止します。

13        ランダムな値。&Array名、配列のアドレスを示しますが、タイプはstrlenのパラメータータイプとは異なりますが、パラメーターが渡された後、+ 1、この文字列をスキップして計算を開始します。 '\ 0'の位置では、いつ停止するかわからないため、異なるコンピューターで計算された結果は異なります。strlenは'\0'に遭遇すると停止します。

14ランダムな値。優先度に注意してください!Priority []>&(アドレス文字を取ります)。配列の最初の要素であるarr [0]は、&がそのアドレスであり、1を加算するとアドレスになります。配列アドレスの2番目の要素(データ型は、1を追加することでポインターが移動できる時間を決定します。これはchar型であり、1を追加すると2番目の要素に1バイトスキップします)。ただし、型はstrlenのパラメーター型とは異なります。 、ただしパラメータは渡されます過去以降、2番目の文字のアドレスから計算が開始されます。文字配列に「\ 0」がないため、いつ停止するかわからないため、計算が行われます。結果はコンピュータによって異なります。「\0」まで停止します。

char *p = "abcdef";

printf("%d\n", sizeof(p));//1
printf("%d\n", sizeof(p+1));//2
printf("%d\n", sizeof(*p));//3
printf("%d\n", sizeof(p[0]));//4
printf("%d\n", sizeof(&p));//5
printf("%d\n", sizeof(&p+1));//6
printf("%d\n", sizeof(&p[0]+1));//7
printf("%d\n", strlen(p));//8
printf("%d\n", strlen(p+1));//9
printf("%d\n", strlen(*p));//10//运行时需要注释掉
printf("%d\n", strlen(p[0]));//11运行时需要注释掉
printf("%d\n", strlen(&p));//12
printf("%d\n", strlen(&p+1));//13
printf("%d\n", strlen(&p[0]+1));//14

解析:

01 4 / 8.pは、アドレスを格納するポインタ変数です。Sizeof(p)は、ポインタ変数のサイズを計算します。ポインタのサイズは4/8です。

02 4 / 8.pは、アドレスを格納するポインタ変数です。+1でも、アドレスのままです。アドレスのサイズは4/8です。

03 1.pはポインタ変数です。*では、この要素を取得します。char型のサイズは1です。

04 1.pはポインター変数であり、[0]と組み合わせて、*(p + 0)と同等、または*p.char型のサイズは1です。

05 4 / 8.pはポインタ変数です。&では、このポインタ変数のアドレスを取得します。アドレスのサイズは4/8です。

06 4 / 8.pはポインタ変数です。&では、このポインタ変数のアドレスを取得します。+1でも、アドレスを指し、アドレスのサイズは4/8です。

 07 4/8.優先度に注意してください!Priority []>&(アドレス文字を取ります)。p[0]は配列の最初の要素であり、&はそのアドレスであり、1を加算するとアドレスになります。配列の2番目の要素のアドレス(データ型は、1を追加することでポインターが移動できる長さを決定します。これはchar型であり、1を追加すると2番目の要素に1バイトスキップされます)。アドレスのサイズは4です。 / 8;

086.pは「a」のアドレスを格納します。strlen関数はこのアドレスから続行します。文字列の最後に「\0」が追加されるため、サイズを計算できます。Strlenは「\」に遭遇すると停止します。 0';

09 5.pは、「a」のアドレスを+1に格納します。これは、「b」のアドレスです。文字列の最後に「\ 0」が追加されるため、strlen関数はこのアドレスから続行します。サイズを計算できます。strlenは「\0」に遭遇すると停止します。

10エラー。pはポインタ変数です。*では、要素「a」が取得されます。文字がメモリに格納されると、ASCIIコード「a」は97になります。strlen関数は引き続き97をアドレスとして使用します。 、その結果、アクセスメモリの競合が発生します。

11エラー。pはポインタ変数であり、*で要素'a'を取得し、+ 1で'b'を取得します。文字がメモリに格納されている場合、ASCIIコード'b'は98.strlen関数です。アドレスとして98を使用すると、アクセスメモリの競合が発生します。

12ランダム値。pはポインタ変数です。&では、「abcdef」のアドレスではなく、pのアドレスが取得され、strlen関数はこのアドレスから続行を開始します。strlenは「\0」に遭遇すると停止します。

13        ランダム値。pはポインタ変数です。&ではpのアドレスを取得し、+ 1では別のアドレスであり、「abcdef」のアドレスではありません。strlen関数はこのアドレスから続行します。strlenは'\に遭遇します。 0'は停止します。

14ランダムな値。優先度に注意してください!Priority []>&(アドレス文字).p [0]、配列の最初の要素、&はそのアドレスであり、1を追加してもアドレスであり、2番目です。配列アドレスの要素(データ型は1を加算することでポインターが移動できる時間を決定します。これはchar型であり、1を加算すると1バイトスキップして2番目の要素に到達します)、パラメーターが渡された後、次のように計算を開始します。 2番目の文字のアドレス。strlen関数はこのアドレスから続行を開始します。strlenは「\0」に遭遇すると停止します。

3.次のステートメントによって出力される結果は何ですか?

//二维数组
int a[3][4] = {0};

printf("%d\n",sizeof(a));//1
printf("%d\n",sizeof(a[0][0]));//2
printf("%d\n",sizeof(a[0]));//3
printf("%d\n",sizeof(a[0]+1));//4
printf("%d\n",sizeof(*(a[0]+1)));//5
printf("%d\n",sizeof(a+1));//6
printf("%d\n",sizeof(*(a+1)));//7
printf("%d\n",sizeof(&a[0]+1));//8
printf("%d\n",sizeof(*(&a[0]+1)));//9
printf("%d\n",sizeof(*a));//10
printf("%d\n",sizeof(a[3]));//11

解析:

01 48.配列名aはsizeofのみの中に配置され、配列全体のサイズが計算され、サイズは4 * 3*4バイトです。

02 4.aは単独では配置されません。これは、配列の最初の要素のアドレスです。a [0] [0]は、最初の行を取得し、この行の最初の要素を取得することを意味します。タイプはintです。 、サイズは4です。

03 16.aは単独は配置されません。これは、配列の最初の要素のアドレスです。最初の要素は、最初の行の配列全体です。サイズは4*4です。

04 4 / 8.aは単独は配置されず、配列の最初の要素のアドレスであり、 + 1では、配列の最初の行の2番目の要素であり、アドレスのサイズは4です。 / 8;

05 4.aは単独は配置されず、配列の最初の要素のアドレスです。 [0]は、最初の行の要素であることを示します。+1では、この行の2番目の要素のアドレスです。が取得されます。*で取得されます。この要素はint型で、サイズは4です。

06 4 / 8.aは単独は配置されず、最初の行である配列の最初の要素のアドレスです。+1で、最初の行をスキップし、2番目の行に到達し、のアドレスを取得します。 2行目、アドレスのサイズは4/8です。

07 16.aは単独は配置されず、最初の行である配列の最初の要素のアドレスです。+1で、最初の行をスキップし、2番目の行に到達し、2番目の行のアドレスを取得します。 、*で、この行の配列全体を取得します。サイズは4*4です。

08 4 / 8.a [0]この配列の最初の行を取得します。ここで、&はこの行のアドレスです。+1で、この行をスキップして2番目の行のアドレスを取得します。アドレスのサイズは4/です。 8;

09 16.a [0]この配列の最初の行を取得し、&はこの行のアドレスです。+1で、この行をスキップし、2番目の行に移動し、*で2番目の行を取得します。 int、サイズは4*4です。

10 16.aは単独は配置されません。これは、配列の最初の要素、つまりこの行のアドレスです。*で、この行を取得します。これはint型で、サイズは4*4です。

11 16.aは単独は配置されず、配列の最初の要素のアドレスであり、 [3]で4番目の行を取得します。ここでa [3]は範囲外ですが、sizeofはサイズを計算しません。実際、sizeofが計算するときは、占有されているスペースのサイズのみが考慮されます。そのビューでは、ここでのa[3]はa[0]およびa[1]と同じです。この行の配列名、サイズは4*4です。

他のトピックへのリンク:

C言語ポインタのいくつかのトピック(2)_Naionのブログ-CSDNブログicon-default.png?t = M0H8https://blog.csdn.net/Naion/article/details/122590308

おすすめ

転載: blog.csdn.net/Naion/article/details/122548523