この一覧表を見てポインタを理解汁!!!

C言語                  イメージ

char * foo1;               ○――→?(参照先は不定、決まっていない)

char * foo2 = NULL;          ○――→NULL

char * foo3 = "STRING";       ○――→"STRING"
                       (6文字+終端文字 [ 'S', 'T', 'R', 'I', 'N', 'G', '\0' ])

char bar1[8];               "????????"(中身は不定、決まっていない)

char bar2[8] = "STRING";       "STRING"
                      (6文字+終端文字、余り1文字は不定 [ 'S', 'T', 'R', 'I', 'N', 'G', '\0', ? ])

printfとかで表示する分には、foo3とbar2は同じ。
ただし、文字列編集をする場合には余りの部分を使えるbarの書き方のほうが有利。
じゃあなんで編集しづらいfooの書き方を使うことがあるのかというと……
欲しいだけのメモリを動的に割り当てるにはfooの書き方が必要になるから。

char * foo;   /* ピッタリの長さの文字列の確保、動的なメモリの取得、などに使う */
char bar[長さ] /* 文字列編集などで一定のメモリを確保する時 */

ってこった。