1

次の C コードでは:

char test[] ={'T','e','s','t'};

printf("%d\n",test == &test[0]); // Returns 1 - Okay as array varaible holds address of first element

したがって、以下は同じように出力されるべきではありませんか?:

printf("value of test %c\n", test); // prints - '|' not even in the array
printf("value of test[0] %c\n", test[0]); // prints - 'T'

それどころか、これらでも異なる値が出力されます。

printf("value of test %p\n", test); // contains a address 0x7ffee9b22b7c
printf("value of test[0] %p\n", test[0]); // also conatains 0x100

何が起こっている?

ありがとう

4

3 に答える 3

0

ポインターの減衰

ポインターと配列は異なる型の変数ですが、多くの場合、配列変数は最初の要素へのポインターとして暗黙的に変換されます。これは、配列からポインタへの減衰と呼ばれます。

これは、 と の間の比較で起こっていることです:はtestと比較できるポインターに減衰し、それらの値は等しい&test[0]test&test[0]

printfあなたの通話で何が起こっていますか?

printf("value of test %c\n", test); // prints - '|' not even in the array
printf("value of test[0] %c\n", test[0]); // prints - 'T'

変換指定子を持つ最初のものは%c、引数をに変換しunsigned charて文字を出力します。最初の行testでは文字として印刷し、2 行目では文字として印刷test[0]します。

の型test[0]は確かに a であるcharため、正しい文字 ( T) が出力されます。ただし、 の型testは の配列でcharあり、この場合、ポインターにも減衰します。テストの実行では、このポインターの値は0x7ffee9b22b7c. 次に、この値はに変換されるunsigned charため、ポインターの最後のバイトが保持されます。その場合、それ7cは character の ASCII コードになります|

ポインターの値に依存するため、プログラムを実行するたびに異なる文字が出力される可能性が非常に高いことに注意してください (それらのいくつかは、出力できない文字でさえあるかもしれません)。

2 つの結果は異なるものであるため、異なります。1 つは文字で、もう 1 つはポインター (この場合は文字へのポインター) です。

test[0]は配列の先頭に含まれる値ですがtest、 は最初の要素へのポインターとして評価されます (その後、強制的に文字に変換されます)。前に指摘したように、test は と同等で&test[0]あり、 とは異なりますtest[0]

test[0]*test(または)と同等*(test + 0)です。一般に、配列でarray[i]は、 と同等になり*(array +i)ます。

于 2020-03-08T05:12:33.773 に答える