【ハウツー】
関数の仮引数の宣言は、宣言文の形をしていますが、通常の変数の宣言とは違います。たとえば、次の2つの仮引数の宣言は、どちらも同じ意味になります。これは、(仮引数ではない)宣言文において*と[ ]とが別の意味を持っていたのとは異なるため、注意を要します。
void func(char *p) ← char型へのポインタpを仮引数とするvoid型関数を宣言
void func(char p[]) ← char型を要素とする配列pを仮引数とするvoid型関数を宣言
C言語で関数を呼び出す際に、関数の引数は「値渡し」という方法で渡されます。これは、関数呼び出しもとの変数等(実引数)の値が、仮引数用のメモリ領域(通常はスタック)にコピーされた上で関数が呼び出されるということです。
引数がintやcharなどの数値であるか、またはポインタである場合は、実引数の値が仮引数の変数に代入されて関数に渡されるだけなので問題ありません。引数が配列の場合は(配列名を実引数にしますが)、決して配列全体のコピーが取られるわけではなく、配列名、すなわち配列の先頭アドレスを示すアドレス定数のみが仮引数の変数に代入されて関数に渡さます。アドレス定数を変数に代入して渡すということは、結局ポインタを渡しているのと同じです。
したがって、関数が呼び出された段階では、実引数がもともと配列名であったのかポインタであったのか区別がなくなります。また、仮引数は、関数内部のローカル変数として値の変更が可能なため、もともとアドレス定数だった値を、関数内部でインクリメント(+1)したり、別の値を代入したりすることすら可能になります。
以上のことから、仮引数の宣言では「char *p」と書いても「char p[]」と書いても同じであり、実際には(配列ではなく)ポインタが渡されているということが言えます。
| 大阪市大とエコナビスタ、疲労医学研究を元にした「快眠健康ナビ」を製品化 [18:00 5/23] |
| 東大、ほ乳類の成体でも「神経幹細胞」が維持される仕組みを解明 [16:59 5/23] |
| 武蔵野化学研究所、高純度ポリ乳酸の高品質化に成功 [14:21 5/23] |
| 成層圏の「赤道準2年振動」は過去数10年弱まり続けている - JAMSTECなど [14:09 5/23] |
| TI、迅速なモーター回転設定が可能なセンサレスBLDCモータードライバを発表 [14:05 5/23] |
|
米NVIDIA、GK110コア採用のハイエンドGPU「GeForce GTX 780」発表 [22:00 5/23] パソコン |
|
【レビュー】「GeForce GTX 780」を試す - GK110コア採用の「TITANの弟分」はどこまでやれるのか [22:00 5/23] パソコン |
|
LG、スマホで撮影した写真をワイヤレス印刷できるモバイルフォトプリンタ [21:56 5/23] 携帯 |
|
[進撃の巨人]主題歌「紅蓮の弓矢」が異例の“歌詞なし”先行カラオケ配信 [21:49 5/23] ホビー |
|
小沢としお週チャンで新連載、謎だらけの学園アクション [21:40 5/23] ホビー |