沢山の人が、エクリプスたんからチョコを貰って行ってくれたようだけれど・・・
読んでるほうが恥ずかしくなるくらい低レベルなCの学習記録は、こんな日こそ淡々と更新したい。(マゾい)
覚えたこと
多次元配列の仮引数
- 関数の仮引数に多次元配列を書くときは、配列のすべての要素数を指定するか、最初の要素数のみ省略する。
- MSVCの場合、すべての要素数を省略すると、添字がないというコンパイルエラーになる。
- また、多次元配列を(多次元でない配列のように)ポインタで渡そうとすると、「配列または、ポインタでない変数に添字が使われました」というコンパイルエラーになる。
ただ、関数呼出しの際には、配列の先頭の値のアドレスが渡されるだけなので、要素数を書いても無視される。らしい。
わかりやすい。ただ、「幼稚に見えるから、仮引数に要素数を指定した配列を渡すな」というのは、理由として納得できないけども ;-P
スコープと記憶域
- 注意すること
- ファイルスコープに存在する識別子と同じ名前の識別子を、より狭いスコープの変数に代入しない。初期化したつもりが不定値が入ってしまう。
- 何もつけずに定義した変数は、初期値を与えないと、不定値で初期化される。auto、registerをつけて定義した変数も同じ。
- staticをつけて定義した変数は、初期値を与えないと、0で初期化される。main関数の実行前に生成され、プログラム終了時に消滅する。
分からないこと
その1。仮引数に多次元配列を取るとき、なぜ最初の要素数を省略できる仕様になっているのか、分からない。メモリの確保の仕方を理解すれば、納得できるのだろうか。
その2。先入観にJavaの文法があるせいか、関数内にstaticのついた変数があると奇異に感じる。「ファイルスコープは与えたくないが、静的記憶域に置きたい」というニーズを理解する必要があるのだと思う。それってどんな状況だろう?
その3。素朴な疑問だけれども、仮引数に必ずconstをつけて、副作用のない関数だけを作ろうとすることは、C言語的ではないのだろうか?