そもそもポインタって何、というのを理解していませんね。おっしゃる通り「C言語の超基礎的内容」です。
ポインタ(pointer)という言葉の意味、考えたことがありますか? なにかを指し示すもの、です。説明資料をプロジェクタで写したときに「ココ」と指し示す棒、あれがポインタです(あるいは今どきだとレーザーポインタを使うかも知れませんが)。ポインタ変数は、その棒の役割を持ちます。ココを見てね、と。
(しばしば「ポインタはアドレス」という言い方もします。これは、「指す」ための手段として、コンピュータの構造、メモリのアドレスを使用しているということです。本当はアドレスの話もしたほうがいいのでしょうけれど、それはまたの機会に。)
さて、ポインタ変数を宣言しました。棒の先はどこを指していますか? さあ?わかりません。でも、あなたはポインタで指される先にarg型の構造体があるから、そこのaやb[0]を見ろ、と命令するプログラムを書きました。Cはプログラマに全責任を被せて言われた通りに動く言語です。そこでプログラムは、少なくともarg型は知っているので、指されている先にarg型のデータがあればaやb[0]があるであろう場所を読んで話を進めてしまいます。
棒を取り出して適当な場所を指してそこに文字があれば読む...こっくりさんとかいう占い? 遊びがありましたが、そんなようなことをしてもコンピュータのプログラムとしてまともに動くことは期待できない、おわかりいただけますね。
ポインタは、必ず、意味のあるデータを指すように設定して使わなければいけません。具体的には(既にある回答と話は被りますけれど)
arg ent;
としてarg型の(ポインタではない)変数を宣言して、そこの所在地(&演算子で求められる)をポインタに設定します。
_data = &ent;
そうすると、ポインタはentを指しているので、アロー演算子->や参照演算子*を使ってentの中にあるaとかb[0]にアクセス出来ます。
あるいは、とにかく場所を確保してそこをarg型の構造体として扱う、なんてていう使い方もありますが、いずれ習うので今はまだ置いておきましょう。
なお、「どこも指していない」ということを表すためにNULLという値が定義さてはいます。どこも指していないポインタにはこの値を設定しておくべき、ではあるのですが、C言語は指示されればNULL(普通は使われないはずの0という値)の場所にあるデータを参照しようとします。そうしないようにプログラムを組むのはプログラマの責任です。
余談。
arg* _data;
さて、_dataはどういう変数? と聞かれた時に arg型のポインタ変数...ではなく、arg型'への'ポインタ変数、と言うように心がけてみて下さい。この表現方法はC言語の規格書でも使われています。'への'とすることで「何かを指している」というポインタの意味がより強調されるのではないか、と思います。