仮引数と多次元配列の話(C入門中)

沢山の人が、エクリプスたんからチョコを貰って行ってくれたようだけれど・・・

読んでるほうが恥ずかしくなるくらい低レベルなCの学習記録は、こんな日こそ淡々と更新したい。(マゾい)

覚えたこと

多次元配列の仮引数
  • 関数の仮引数に多次元配列を書くときは、配列のすべての要素数を指定するか、最初の要素数のみ省略する。
    • MSVCの場合、すべての要素数を省略すると、添字がないというコンパイルエラーになる。
    • また、多次元配列を(多次元でない配列のように)ポインタで渡そうとすると、「配列または、ポインタでない変数に添字が使われました」というコンパイルエラーになる。

ただ、関数呼出しの際には、配列の先頭の値のアドレスが渡されるだけなので、要素数を書いても無視される。らしい。

わかりやすい。ただ、「幼稚に見えるから、仮引数に要素数を指定した配列を渡すな」というのは、理由として納得できないけども ;-P

スコープと記憶域
注意すること
ファイルスコープに存在する識別子と同じ名前の識別子を、より狭いスコープの変数に代入しない。初期化したつもりが不定値が入ってしまう。
  • 何もつけずに定義した変数は、初期値を与えないと、不定値で初期化される。auto、registerをつけて定義した変数も同じ。
  • staticをつけて定義した変数は、初期値を与えないと、0で初期化される。main関数の実行前に生成され、プログラム終了時に消滅する。

分からないこと

その1。仮引数に多次元配列を取るとき、なぜ最初の要素数を省略できる仕様になっているのか、分からない。メモリの確保の仕方を理解すれば、納得できるのだろうか。

その2。先入観にJavaの文法があるせいか、関数内にstaticのついた変数があると奇異に感じる。「ファイルスコープは与えたくないが、静的記憶域に置きたい」というニーズを理解する必要があるのだと思う。それってどんな状況だろう?

その3。素朴な疑問だけれども、仮引数に必ずconstをつけて、副作用のない関数だけを作ろうとすることは、C言語的ではないのだろうか?