C では、以下が有効です。
int a[] = {27,2};
int *b;
int c;
b = a;
c = *b; /* c == 27 */
ポイントは、a は配列の単なるアドレスであるため、ポインターに割り当てることができるということです。構造体についても同じことが当てはまらないのはなぜですか。構造体変数の値は単なるアドレスであるため、次のようにポインターに割り当てることができるはずです。
struct foo bar;
struct foo *doo;
bar.x = 0;
doo = bar; //is this legal?
doo.x = 0; //why can't I use the dot?
言い換えれば、構造体変数の値が最初のコンポーネントのアドレスである場合 (これは配列のような場合だと思います)、上記のコードは有効です。