まぬねこの足跡。。。

備忘録+たのしさ+ひっそりと

C言語 自作関数

関数作成

戻り値の型 関数名(型名 仮引数[,....]){
  処理
}
※最後の「;」は不要

void message(void)
{
    printf("あんぱん たべたい\n");
}

プロトタイプ宣言と関数呼出し

プロトタイプ宣言:プログラム先頭で関数の形を宣言しておくこと。
コンパイラに自作関数の存在を教える。

#include <stdio.h> ←これもプロトタイプ宣言

void message(void); ←プロトタイプ宣言

int main(void)
{
 message(); ←自作関数 呼出し
    return 0;
}

void message(void) ←自作関数 本体
{
    printf("あんぱん たべたい\n");
}

表示イメージ

あんぱん たべたい

引数

※カンマ区切りでいくつでも

void message(int cnt) ←「cnt」は仮引数
{
    printf("%d個、あんぱん たべたい\n",cnt);
}

呼出し

message(5); ←「5」は実引数

表示イメージ

5個、あんぱん たべたい

ポインタ型 引数

#include <stdio.h>
void message(int* cnt);
int main(void){
    int kosu = 10;
    printf("&kosu = %p\n", &kosu);
    message(&kosu);
    printf("kosu = %d\n", kosu);
    return 0;
}
void message(int* cnt) ←「cnt」はポインタ型引数
{
    printf("%d個、あんぱん たべたい\n",*cnt);
    printf("cnt = %p\n", cnt);
    *cnt = 3; ←関数内でポインタ型引数を変更=元の変数kosuの中身を変更
}

表示イメージ

&kosu = 0x7ffd79c2868c
10個、あんぱん たべたい
cnt = 0x7ffd79c2868c
kosu = 3

配列型 引数

配列の先頭のアドレスを渡す。
素数は、関数側には不明。

#include <stdio.h>
void message(int cnt[]);
int main(void){
    int A[] = {10,20,30};
    message(A);
    return 0;
}
void message(int cnt[])
{
     int sum = 0;
    for (int i = 0; i < 3; i++) {
        sum += cnt[i];
    }  
    printf("%d個、あんぱん たべたい\n",sum);
}

表示イメージ

60個、あんぱん たべたい

構造体 引数

値渡しになる。
構造体タグ+型登録
typedef struct member_kata
{
int team;
int number;
char name[50];
} member;
関数
void member_print(member data){}
呼出し
member data;
member_print(data);

構造体型 ポインタ引数

構造体タグ+型登録
typedef struct member_kata
{
int team;
int number;
char name[50];
} member;
関数
void member_print(member *data){}
呼出し
member data;
member_print(&data);

戻り値

戻り値は1の値のみ
void:戻り値がない
関数

int message(int cnt) ←「cnt」は仮引数
{
    printf("%d個、あんぱん たべたい\n",cnt);
    return cnt;
}

呼出し

int kazu=0;
kazu=message(5); ←「5」は実引数
printf("%d個もらった\n",kazu);

表示イメージ

5個、あんぱん たべたい
5個もらった