ゾンビでもわかるC言語プログラミング

C言語入門者の応援をします

関数の基本

Index

1. 関数の基本

関数を使用する際は、以下のようになっています。

関数名(第一引数, 第二引数, 第三引数, ...);

これを今まで使ってきたprintf関数に当てはめると以下のようになります。

printf("%s %d\n", "string", 100);

printf関数のカンマで区切られている最初の "%s %c %d\n" を第一引数、"string" を第二引数、100 を第三引数、と呼びます。

また、文字列の長さを求める関数である strlen関数は以下のように使用します。

#include <stdio.h>
#include <string.h>

int main() {
  int len;

  len = strlen("ABCD");

  printf("%d\n", len);

  return 0;
}

これを実行すると、"ABCD" の長さである 4 が出力されます。

4

strlen関数を見てみると、第一引数に "ABCD" を与えています。
そして、len という変数になにやら代入しています。

関数は、戻り値というものを持っているものがあり、strlen関数は、第一引数にとった文字列の長さを戻り値として返します。
右辺のstrlen関数は、第一引数でとった文字列の長さの値になり、この場合は 4 になるのです。
つまり、以下と同じになります。

len = 4;

2. 関数を作成してみる

関数は自分で作成することができます。
実際に引数で与えた二つの値を足すtest関数を作成してみましょう。
以下のコードを実行します。

 1  #include <stdio.h>
 2  
 3  int test(int num1, int num2) {
 4    return num1 + num2; // num1 と num2 を足して返す
 5  }
 6  
 7  int main() {
 8    int i;
 9  
10    i = test(5, 10); // test関数の戻り値を i に代入
11  
12    printf("%d\n", i);
13  
14    return 0;
15  }

実行すると、以下の出力が得られたかと思います。

15

3 ~ 5行目がtest関数です。
関数は以下のように定義します。

戻り値の型 関数名(第一引数の型 変数名, 第二引数の型 変数名, ...) {

上記コードでいうと3行目に当てはまります。

int test(int num1, int num2)

この場合、戻り値の型は int 型で、引数を二つとり、二つとも int 型という意味になります。

4行目をみてみましょう。

return num1 + num2;

return は、後ろにくるものを戻り値を返すもので、今回は、num1 と num2 を足して戻り値として返しています。

return で返した値を 10行目で変数 i に代入しています。

i = test(5, 10)

よって、iには、5 と 10 を足した 15 という値が入ります。

3. 関数を作成してみる2

以下を実行してみましょう。

 1  #include <stdio.h>
 2  
 3  void test(char* name, int age) {
 4    printf("name: %s\n", name);
 5    printf("age: %d\n", age);
 6  }
 7  
 8  int main() {
 9  
10    test("Taro", 18);
11  
12    return 0;
13  }

以下の出力が得られると思います。

name: Taro
age: 18

3行目で先ほどと同じように関数を定義しています。

void test(char* name, int age)

しかし、今度は void という値が出てきました。
これは、戻り値を返さないという意味になります。
戻り値を返す必要のない関数では、この void を記述します。

引数には、文字列型である char* と整数型である int が指定されています。
4,5行目では、引数で受け取った name と age をprintf関数で表示します。

4. 注意

また、作成した関数を使用する際は、使用するより前に関数を定義していないといけません。
以下のようにtest関数を使用する前に、関数定義を行なっていないとコンパイル時にエラーになります。

#include <stdio.h>

int main() {
  test("Taro", 18);

  return 0;
}

void test(char* name, int age) {
  printf("name: %s\n", name);
  printf("age: %d\n", age);
}

これを回避するには、使用する前に関数作成するか、以下の3行目のように宣言だけ先にする必要があります。

 1  #include <stdio.h>
 2  
 3  void test(char*, int);
 4  
 5  int main() {
 6    test("Taro", 18);
 7  
 8    return 0;
 9  }
10  
11  void test(char* name, int age) {
12    printf("name: %s\n", name);
13    printf("age: %d\n", age);
14  }

書籍

新・明解C言語 入門編 (明解シリーズ)

新・明解C言語 入門編 (明解シリーズ)

苦しんで覚えるC言語

苦しんで覚えるC言語

やさしいC 第5版 (「やさしい」シリーズ)

やさしいC 第5版 (「やさしい」シリーズ)

C実践プログラミング 第3版

C実践プログラミング 第3版