次の中で、printfがhelloを出力する方法を説明できる人はいますか?
#include<stdio.h>
void main()
{
char *p;
p="hello";
printf("%s",*&*&p);
}
*&p... は p の値、つまり文字列 "hello" のアドレスを意味することを知っています。最初の *& で何が起こっているか
あなたが言ったように、はを意味*&p
します。したがって、あまりにもなります。p
*
&
*&*&p
p
@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
-*&
互いに打ち消し合うことがわかります。これを繰り返すことができます: *&*&p
will still be p
. あなたはこれを無限に行うことができ*&*&*&*&*&*&*&*&*&p
ますp
。
'*&' は互いにキャンセルします。p のアドレスを取得してから、再度逆参照しています。したがって、最終結果は p になります。