ポインタって何? 「アドレスを格納するための変数」...間違いではないです。でも、いきなり「アドレス」が出てくるのはどうでしょう。
(なお、ポインタは変数である、というのはちょっと抵抗あるのですが、かのK&Rでそういう表記をしているので仕方なくそれに従います)
高級言語としての抽象度の高いスコープでは、「どこかにある(変数等の)データ領域を指すための変数」であるということで理解すべきかと思います。
そして、「どこかにあるデータを指す」ための具象的な手段は、以前の回答で示したように変数の実体がメモリの一区画ということなのでその場所「アドレス」を示すことによる、ということです。
(以前の質問で、メモリーの話をしましたので、変数とメモリーそしてアドレスの関係はご理解いただいているものと思います)
さて。Cで関数を呼び出すとき、その引数は全て「値渡し」です。値渡しというのは、関数を呼び出す側でカッコの中に記述されたのが変数なら変数の値、式ならその式の結果を、関数の定義側の仮引数に「値として」設定します。結果として、ご存知のように、関数の中でいくら引数として与えられた変数をいじろうとも、関数を呼び出した側には全く影響がありません(もちろん、C言語のことですから間違った方法でいじるととんでもないことが起こるかも知れませんが、それは今は考えません)。
でも、scanf()あるいはscanf_s()で例えば
int a;
scanf("%d",&a);
とすると、aに値が設定されて関数から戻ってきます...何故? もちろん、aに&がついているから。&ってなんでしたっけ。アドレス演算子。アドレス演算子って何をする? オペランド(演算対象)の変数のアドレスを求める。アドレスを値として持つものってなんだったけ...はい、ポインタです。ポインタつまり変数の在り処を関数に値として渡すと、関数は変数の在り処がわかるので、変数の中身を操作出来るのです。
つまり、関数内で、呼び出し元の変数の中身を操作するとき、必ず引数としてポインタが与えられる必要があるのです。前のbzero()なんかも同じ話だったわけですし、scanf()でももちろんそう。
C
1char gook[10];
2
3void go(int i) {
4 scanf_s("%s",gook[i],4); //文字列を格納する場所(変数)のアドレスを指定・・・していません
5}
でscanf_s()に与えられているのはgook[i]。これはchar型の変数です。これで関数を呼び出すと、char型の値がscanf_s()に渡されますが...gook[i]が例えば128だったとして、それを貰ったscanf_s()としては、'128'を知ってもgook[i]を変化させる術にはならないのです。
(なお、C言語ではそもそも値の型チェックがおざなりでバグの元となりがちなのですが、 scanfは汎用性を実現するためにほとんど引数のチェックが行われず、本当にとんでもない呼び出しでもエラーにも警告にもならずに粛々と破滅的な動作をしたりします。)
「ポインタの配列に代入」で問題になっていたのはなんだったか...
確かRubyでもempty?ってありますよね。そういうことです。ポインタの配列は宣言しました。でも、その配列の要素であるそれぞれのポインタはどこを指しているのでしょう...変数の宣言場所によって期待値はちょっと変わりますが、いずれにせよ意味のあるオブジェクトを設定していないので駄目、というのがその質問の骨子です。
配列とポインタの関係
Cは、いろいろな手間を「プログラマの責任」で片付けることで処理系の負担を減らし、かつ人間の方が頭を絞ることで効率の良いプログラムを組めるようにしている言語です。そのポリシーの一環として、配列の扱いがとんでもないこと(?)になっています。
配列って、その要素になる変数が並んでいるものです。なら、先頭要素の在り処(ポインタ)だけわかれば、2番め、3番めにもアクセス出来ますね。じゃあそういうことに決めましょう。配列を扱うときは、先頭の要素へのポインタを扱うものとします。要素数? 別途管理して下さい...そういうことです。
文法的なところで言えば、配列を宣言し、その配列が単独で記述されたとき、コンパイラはそれを「配列の先頭要素へのポインタと解釈する」というCの規則があるのです。(例外はちょっとあって、それこそ&演算子を作用させるときとかはイロイロあるんですけれど、今は棚上げしておきます)
そのため、
C
1char gook[10];
2
3void go( void ) {
4 scanf_s("%s",gook,4); //文字列を格納する場所(変数)のアドレスを指定している
5}
というプログラム(片)は正しくて、gookに標準入力から文字列を取り込むことが出来ます。
ちなみに、配列の要素 gook[i]に「文字」を取り込むなら&を使って
C
1char gook[10];
2
3void go(int i) {
4 scanf_s("%c",&gook[i],4); //文字を格納する場所(変数)のアドレスを指定する
5}
となります。gookもポインタ、&gook[i]もポインタであることは言うまでもありません。
ちょっと周辺まで書きすぎてボケちゃったかな...