変に書いてしまってすみません。
ucharはunsigned charです。

struct aaa *pa = (struct aaa *)&c[0] ;
struct bbb *pb = (struct bbb *)&c[0] ;
このような、型は違うけど変数名が同じという表記がありまして、
この場合ポインタ変数pa,pbは両方ともc[4]の先頭アドレスを示していると
自分では思ってるのですが、解釈としては合ってますでしょうか?