thisdesuのブログ

C言語はじめました

にほんブログ村 IT技術ブログ C/C++へ

関数って、、

関数とは処理を一まとめにした塊を、いろんな所で使いたい!使いまわししたい時に、「関数」って枠組みで作っておくと、色々なところから使えるようになります。この「関数」を使うには作法というかルールがあり、そのルールの事を関数インタフェース仕様とかリファレンスとか呼ばれます。ルールには大きく2つあります。1つ目は関数にデータを与えるルール。後に出てきますが”引数”と呼ばれる部分です。2つ目は関数から渡されるルール。これも後に出てきますが”戻り値”と呼ばれる部分です。このように関数に”何”を渡して、”何”が返ってくるかのルールを知ることで、関数を使えたり、関数を作れたりします。
この2つ特徴として、”引数”は0個(*1)から複数の引数を付ける事が出来ます。ただしルールとしては個数は予め決めておくこと(*2)、”戻り値は”0個(*1)か1つしか無いのが異なります。また、これらは渡すだけで値が変わってしまうことは無いので要注意です。(*3)
よくC言語の勉強でprintfとか、strpcyなどの記号が出てきますが、これは予め用意されている「関数」ってだけで自分で作る「関数」と何ら変わりません。

■関数書式
戻り値型 関数名( 第1引数の型と記号,第2引数の型と記号,,,,) {
処理
第1引数の記号,,,あれやこれや
第2引数の記号,,,あれやこれや
処理
・・・
return(戻り値);
}

■例

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

int foo(int prm1,char prm2, char *prm3) {
    int rtn = 111;

    printf("[3] %d %c %s %d\n",prm1,prm2,prm3,rtn);

    prm1 = 2;
    prm2 = 'B';
    strcpy(prm3,"xyz");
    rtn    = 999;

    printf("[4] %d %c %s %d\n",prm1,prm2,prm3,rtn);

    return(rtn);
}

int main(int argc,char **argv) {
    int  p1;
    char p2;
    char p3[4];
    int  r;

    p1 = 1;
    p2 = 'A';
    strcpy(p3,"abc");
    r = 100;

    printf("[1] %d %c %s %d\n",p1,p2,p3,r);

    r = foo(p1,p2,p3);

    printf("[2] %d %c %s %d\n",p1,p2,p3,r);

    return 0;
}

■実行結果

$ gcc main.c
$ ./a.out
[1] 1 A abc 100
[3] 1 A abc 111
[4] 2 B xyz 999
[2] 1 A xyz 999

(*1):不要の場合はvoid型を定義します
(*2):va_argなど可変引数も有りますが、C言語マスターになったら覚えましょう。いきなりprintfが可変引数なんですが・・・
(*3):C言語で参照渡しとか言われますが厳密には実態渡ししかないです。ポインタ渡しでポインタが指す領域が変更することは可能ですが、"渡し"での部分のポインタの領域は実態渡しです。スパゲティがお好きな方は、externやグローバル変数など