Skip to content

Latest commit

 

History

History
103 lines (79 loc) · 3.73 KB

L04.md

File metadata and controls

103 lines (79 loc) · 3.73 KB

関数

同じような処理を繰り返す場合や、見た目を見やすくするためなどで処理をまとめたい場合、関数を作ることがある

ちなみに、main関数も関数の一つで、プログラムは実行されると最初にmain関数を呼ぶ(例外あり)

関数を実行することを「関数を呼び出す」ということもあり、関数を呼び出した側を呼び出し元、呼び出された関数を呼び出し先ということもある

/* 宣言 */
戻り値の型 関数名(引数);

/* 呼び出し */
関数名(引数);

/* 定義 */
戻り値の型 関数名(引数){
  式
};

引数とは

引数とは、関数に渡す変数の事で数学でいうf(x,y)のx,yにあたる
ただし、関数に引数を渡すときに基本はコピーされ、関数内部で変数値を弄っても呼び出し元の変数には影響しない(例外あり、ポインタ渡し参照)

関数定義と関数宣言の違い

関数宣言は関数が存在することをコンパイラに伝えるために存在するので、関数の中身(実装/定義)を書く必要はない

※なんなら変数名も必要がないので、

int function(int, double);

みたいに型名だけでも問題ない

関数定義は関数の中身を書く必要がある(実装ともいう)

配列

配列とは変数の行列のことで、プログラム内ではよくforやwhileなどと一緒に利用される

/* 宣言 */
型名 変数名[行列サイズ]; /* 1次元行列 */
型名 変数名[xサイズ][yサイズ]; /* 2次元行列 (縦x横yの行列) */

上記のように宣言でき、配列の次元が増えるごとに[]が増えていく
たぶんメモリ上限が来るまで次元は増やせる(知らんけど)

また、各要素を参照するには以下のように位置を指定する

/* 参照 */
型名 変数名[位置]; /* 1次元 */
型名 変数名[x位置][y位置]; /* 2次元 */

ポインタ

変数はメモリ上のどこかを必ず使用して(?)おり、その変数が使っているメモリのアドレスをポインタという

以下のようにしてポインタの値を参照できる

int number; /* 変数 */
&number; /* 変数のポインタ */

また、c/c++では変数にポインタの値を代入することもできる
全ての変数型に*をつけることでその変数型のポインタを保持する変数を宣言できる

int *ptr; /* int型のポインタ */

ポインタ型の変数から実際の値に参照するにも*を利用する

int *ptr; /* ポインタ */
*ptr; /* ポインタがさす変数の値 */

※ポインタが指す変数の値を書き換えると元の変数の値も書き換わるので、関数にポインタを渡すときは注意が必要、またそれを利用して元の値を書き換える方法にポインタ渡しがある(ポインタ渡し参照)

ポインタ渡し

関数を呼び出すときに変数の値をコピーせずにポインタを渡すことで、元の変数の値を変更したり高速化したりすること

構造体

複数の変数をひとまとめにした新しい変数を作成する 構造体の型定義は以下のようにして行う

struct 構造体名 {
  型名 変数名;
  型名 変数名;
      :
};

また作った構造体型で変数を宣言するには、以下のようにする

struct 構造名 変数名;

※ただし、毎回 struct 変数名 と書くのは大変なので、よく以下で説明するtypedefと一緒に利用される
また、中身の変数へアクセスするには以下のようにする

(構造体の)変数名.(中身の)変数名;