演算子じゃなくて、シンボルの話してるんですが。
char *p = (char *)&p;
でもいいんですが、宣言の初期化で宣言元(?)をリテラルに含めていいのか、って話です。
例えばbcc32では下記はエラーになります。gccやtccではOKです。
char *p[] = { (char *)&p };

動作がどーのこーのではなく、規格ではどう定義されてるのか調べてます。