char a[]="helloworld";
「l」のアドレスを取得したいですか?
(a+2)
またはlloworld&a[2]
を与えます。他のアンパサンドを追加すると、エラーが表示されます。
では、「l」のアドレスを取得する方法は?
できない場合は、説明してください。
a + 2
は配列の 3 番目の要素のアドレスで、これは最初の のアドレスですl
。
この式でa
は、 型char[11]
の が最初の要素へのポインターに暗黙的に変換され、 が追加されて配列の 3 番目の要素のアドレスが得られる 型のポインターが生成char*
さ2
れます。
&a[2]
同じ結果が得られます。 a[2]
は と同等*(a + 2)
であるため、完全な式は と同等&*(a + 2)
です。&
と が*
相殺され、 が残ります。a + 2
これは上記と同じです。
このアドレスがプログラムでどのように解釈されるかは別の問題です。「単一のオブジェクトへのポインター」として使用できますchar
。その場合、最初のl
. ただし、「指す先の で始まる配列に含まれる C 文字列へのポインター」として解釈することもできchar
ます"lloworld"
。
どちらも正しいですが、出力したい場合は次のいずれかを行う必要があります。
C の場合: 適切な書式文字列を使用します (C の場合):
printf("address: %p\n", &a[2]);
C++ の場合: a にキャストすることにより、cout による文字列解釈を回避しますvoid*
。
cout << "address: " << static_cast<void*>(&a[2]) << endl;
'lloworld'をあきらめるとはどういう意味ですか。これをC文字列として使用する場合でも、nullで終了します。文の少し先から始めてください。
strchr
は、文字列内で特定の文字が最初に出現する場所 (のアドレス)へのポインタを返します。