char A[3] = {1,2,3} ;
char **cpp ;

cpp= &((char*)A) ;

をコンパイルすると左辺値でない(char*)Aに対して&を使おうとしました。って
コンパイルエラーになります。まあ、よく考えてみればその通りだと思いますが、
*(char*)A = 3 ;
ってコードはOKなわけだから*(char*)Aは左辺値なわけですよね。
左辺値でない式に*をつけると左辺値になるってことのようだけど、
これってC言語の文法だとどう説明できるかわかる方いますか?

実際にどう考えればよいかではなくて、C言語の厳密な文法ではどのように
解釈されてこのようなことが正当化されているのかってのが質問です。
わかる方いたらよろしくお願いします。