次の中で、printfがhelloを出力する方法を説明できる人はいますか?
#include<stdio.h>
void main()
{
char *p;
p="hello";
printf("%s",*&*&p);
}
*&p... は p の値、つまり文字列 "hello" のアドレスを意味することを知っています。最初の *& で何が起こっているか
あなたが言ったように、はを意味*&pします。したがって、あまりにもなります。p*&*&*&pp
@Kerrek が (コメントで) 言った*&pように、左辺値を生成するので、そのアドレスをもう一度取得します。
あなたのコードは標準に準拠していないことに注意してください。戻り型としてmain()持つ必要があります。また、非 constintに割り当てることはできません。である必要があります。標準適合コードは次のようになります。"hello" char*const char*
#include<stdio.h>
int main()
{
const char *p = "hello";
printf("%s",*&*&p);
}
&pのアドレスですp。
*pはアドレスが指し示すものですp。
*&pは*(&p)、アドレスによって指されるもので&pありp、それ自体です (つまり、アドレス「p のアドレス」によって指されるもの)。
したがって、それ*&pはちょうどp-*&互いに打ち消し合うことがわかります。これを繰り返すことができます: *&*&pwill still be p. あなたはこれを無限に行うことができ*&*&*&*&*&*&*&*&*&pますp。
'*&' は互いにキャンセルします。p のアドレスを取得してから、再度逆参照しています。したがって、最終結果は p になります。