# C言語 ##### constおよびポインタの関係 以下の場所によって「const」と「*」によって変更不可となる部分が異なる - const char* - char* const - const char* const ##### 2次元配列を関数に渡す 参考サイト:[[https://lipoyang.hatenablog.com/entry/20130829/p2|2次元配列を関数に渡すとき - 滴了庵日録]] ``` int func (???) { (hogeを使った処理) ・・・ } int main(void) { int hoge[4][3] = { 0 }; func(hoge); } ``` この時、「???」に何を渡せばよいかというと、 **正解** - (*hoge)[3] - (hoge[][3] - hoge[4][3] 3つは等価で、「(サイズ3の配列)へのポインタ」 **間違い①** - (*hoge)[] - hoge[][] - hoge[4][] 以上の3つは等価で、「(サイズ不明の配列)へのポインタ」 サイズが不明なのでアドレスを計算できず、コンパイルエラー **間違い②** - **hoge - *hoge[] - *hoge[3] 以上の3つは等価で、「ポインタへのポインタ」 呼び出し元と方が合わないのでコンパイルエラー ##### ダブルポインタ 参考サイト:[[https://lipoyang.hatenablog.com/entry/20130829/p1|ダブルポインタ - 滴了庵日録]] ^ 方法 ^ 説明 ^ | 値渡し | 呼び出し元に変化なし | | ポインタ渡し | 呼び出し元の値を変更可。参照に変化なし\\ 配列を渡して各値を変更可 | | ダブルポインタ渡し | 呼び出し元参照も変更可。\\ ポインタ配列を渡して各参照も変更可 |