【C言語】関数知識まとめ(1)

導入

モジュール式プログラミング手法は通常、比較的複雑な問題をいくつかの比較的単純なサブ問題に分解し、それらを個別に解決して問題解決の複雑さを軽減します。特定のサブ問題を解決するコードがすでにある場合は、そのコード (関数) を直接使用できます。C言語プログラムは1つ以上のプログラムモジュールから構成され、各プログラムモジュールは1つ以上の関数から構成されているため、関数はモジュールプログラミングを実現する上で欠かせない重要な仕組みです。

1. 機能概要


  • 関数の本質: 繰り返し呼び出すことができ、比較的独立した関数を持つプログラム セグメント
  • 機能導入の目的:
    1. 構造化・モジュール化されたプログラミングを容易にするため
    2. コードの重複を解決するため

関数呼び出し
C 言語プログラムの規模が大きい場合、複数のソースファイルから構成される場合がありますが、main 関数 main() を含むソースファイルは 1 つだけであり、他のソースファイルに main 関数を含めることはできません。main 関数は他の関数を呼び出すことができますが、その逆はできません。他の関数は相互に呼び出すことができ、同じ関数を 1 つ以上の関数から何度でも呼び出すことができます。関数が別の関数を呼び出す場合、前者を呼び出し関数と呼び、後者を呼び出し先関数と呼びます。
  • 機能分類:
    機能分類

2. 関数の定義

1. パラメータなし関数の定義

型名関数名()
{ 関数本体}または型名関数名(void) { 関数本体}







  • 型名は関数の戻り値の型を指定します。省略した場合、デフォルトの関数戻り値の型は int になり、void は関数にパラメーターがないことを意味します。
  • 関数本体には宣言部分とステートメント部分が含まれます (一部のみである場合もあれば、まったく含まれない場合もあります)。
  • 宣言部分は主に変数の宣言や呼び出される関数の宣言です。
  • 実行部分は実行ステートメントで構成され、関数の機能はこれらのステートメントによって実装されます。

2. パラメータ化された関数の定義

型名 関数名(仮引数リスト)
{ 関数本体}仮引数リスト 形式:タイプ1 仮パラメータ1、タイプ2 仮パラメータ2、...、タイプn 仮パラメータn



#include<stdio.h>
#include<math.h>
double fact(int n);//函数声明
int main()
{
    
    
	int i = 1;
	double x, item, s = 0;
	printf("输入x的值:");
	scanf("%lf", &x);//由键盘读入浮点数x的值
	item = x;
	while (fabs(item) >= 0.00001)
	{
    
    
		s = s + item;//累加一项
		i++;//累计次数
		item = pow(x, i) / fact(i);//调用函数,fact()函数中i为实参
	}
	printf("和是:%lf\n", s);
	return 0;
}
double fact(int n)//函数首部 n为形参
{
    
    
	int i;
	double jc = 1;//阶乘变量赋初值
	for (i = 1; i < n; i++)//计算阶乘
		jc = jc * i;
	return jc;//返回阶乘
}

3.空関数の定義

型名 関数名 ()
{ }


  • 将来的に改善が必要な関数である可能性がある関数を宣言するために使用されます。
  • その目的は、プログラム構造が明確で可読性が高く、将来の機能拡張が容易であることです。

3. 関数呼び出し


関数を定義する目的は再利用することなので、プログラム内で関数を呼び出すことによってのみその関数の機能が実現されます。


1. 関数呼び出しの形式とプロセス

(1) 関数呼び出しの一般的な形式

関数名(実パラメータ一覧欄)

  • 実パラメータリストは、実パラメータ、または略して実パラメータです。定数、変数、式を指定できます
#include <stdio.h>

// 定义一个函数,它有三个形式参数
void print_values(int a, float b, char c) {
    
    
    printf("The values are: %d, %f, %c\n", a, b, c);
}

int main() {
    
    
    int x = 3;
    float y = 3.14;
    char z = 'A';

    // 调用函数print_values(),传递常数、变量和表达式作为实参
    print_values(1, y, 'B');
    print_values(x, 2.5, z);
    print_values(x + 1, y * 2, z + 1);

    return 0;
}

  • 実際のパラメータはカンマで区切ります
  • 実際のパラメータの数とタイプは、関数パラメータの数とタイプと一致している必要があります。
  • パラメータなし関数の場合、実際のパラメータリストはありませんが、括弧は省略できません。

(2) 関数の呼び出し方法

Ⅰ.関数ステートメント
把函数调用作为一条语句
一般形式:函数名(实参表列);
这种方式常用于调用一个没有返回值的函数,只要求函数完成一定的操作
Ⅱ.関数式
函数调用作为表达式中的一部分出现在表达式中,
以函数返回值参与表达式的运算
Ⅲ. 関数ネストの利用

C言語プログラムはメイン関数から実行を開始し、カスタム関数の実行はカスタム関数を呼び出すことで実現されます。カスタム関数が終了すると、カスタム関数の終了からメイン関数の呼び出し点に戻り、メイン関数が終了するまで実行を続けます。

ネストされた関数呼び出し

C语言的函数定义是互相平行、独立的,也就是说,在定义函数时,
一个函数内不能再定义另一个函数,也就是不能嵌套定义,
但可以嵌套调用函数

(3) 関数呼び出しの処理

  • 1. 呼び出された関数のすべての仮パラメータにメモリを割り当て、次に実パラメータの値を計算し、対応する仮パラメータに 1 つずつ割り当てます (パラメータのない関数の場合、この作業は行われません)
  • 2. 関数記述部で定義した変数の格納領域を確保し、関数の実行文を順番に実行します。「return(式);」文を実行すると戻り値が計算されます(戻り値のない関数の場合はこの作業は行われません)。
  • 3. この関数で定義された変数が占有している記憶領域を解放し(静的型変数の場合、領域は解放されません)、メイン呼び出し関数に戻って実行を継続します。

2.パラメータの受け渡し


  • パラメーター化された関数を呼び出す場合、呼び出し元の関数と呼び出される関数の間にはデータ転送関係が存在します。
  • 呼び出し側関数は、主に関数のパラメーターを通じて、呼び出される関数にデータを転送します。
  • 呼び出された関数は、通常、return ステートメントを通じて呼び出し関数にデータを転送します。
  • 仮パラメータは、関数を定義するときに関数名の後ろに括弧で囲まれた変数です。
  • 実パラメータとは、関数呼び出し時に関数名の後ろに括弧で囲まれた定数、変数、および式を指します。
  • 関数を呼び出すときは、仮パラメータが実パラメータと数値的に同じになるように、実パラメータの値を仮パラメータに渡します。
  • パラメーター データを渡す 2 つの方法: 値による受け渡しとアドレスによる受け渡し

(1) 値渡し


  • 関数が呼び出されるとき、呼び出し関数は実パラメータの値を呼び出された関数の仮パラメータに渡します。仮パラメータ値の変更は実パラメータの値には影響しません。これは一方向のデータ転送メソッドです。 。
  • 実際のパラメータが変数、定数、式、配列要素、または関数である場合、関数は式を使用してデータを値で渡します。

#include <stdio.h>
void swap(int x, int y)
{
    
    
    int t;
    t = x; x = y; y = t;
    printf("x=%d,y=%d\n", x, y);
}
int main() 
{
    
    
    int a, b;
    scanf("%d,%d", &a, &b);
    swap(a, b);
    printf("a=%d,b=%d\n", a, b);
    return 0;
}

結果:
ここに画像の説明を挿入します


  • 実パラメータの数とデータ型は仮パラメータと一致している必要があります。一致していないとコンパイル エラーが発生します。
  • 関数が定義されている場合、システムはストレージ ユニットを仮パラメータに割り当てません。関数が呼び出されたときにのみ、ストレージ ユニットが仮パラメータに割り当てられます。呼び出しが完了すると、仮パラメータによって占有されていた記憶装置が解放されます。
  • 実パラメータと仮パラメータが同じ名前であっても、異なる記憶装置が割り当てられます。
  • パラメータ転送が「値転送」の場合、一方向の転送になります。つまり、実パラメータは仮パラメータに値を渡しますが、仮パラメータの値を実パラメータに渡すことはできません。仮パラメータを変更しても、対応する実パラメータには影響しません。これは、メモリ上では実パラメータと仮パラメータの記憶部が解放されており、関数の実行後に仮パラメータの記憶部が解放されるためである。

(2)住所ごとに配送


関数の仮パラメータが配列またはポインタ型である場合、関数呼び出しでのパラメータの受け渡しは、アドレスによる受け渡しと呼ばれます。アドレスが渡されるため、仮パラメータと実パラメータは同じ記憶装置を共有するため、アドレス内のデータを直接参照したり、仮パラメータを通じて加工したりすることで、実パラメータの値を変更する目的を達成できます。


3. 関数の戻り値

1. 関数の値は、return ステートメントを介して呼び出した関数にのみ返すことができます。

return 表达式;
return (表达式);//如 a>b?:a:b

関数内では複数の return ステートメントを使用できますが、論理的には呼び出しごとに 1 つの return ステートメントのみを実行できます。
2. 呼び出された関数から関数値を返す必要がない場合は、return 文を省略できます。このとき、関数本体の最後の文を実行した後、呼び出された関数は自動的に飛び出し、不定な値を返します 3.
return 文の式の値の型は、関数本体の関数の型と一致している必要があります。関数定義。

4. 関数宣言

1. 宣言してから使用する
(1) ライブラリ関数を呼び出す場合は、通常、プログラムの先頭で「#include」コマンドを使用する必要があります。
(2) ユーザ定義関数を呼び出す場合、関数の宣言形式は次のとおりです。

类型名 函数名(参数类型1,参数类型2...);
类型名 函数名(参数类型1 形参1,参数类型2 形参2,...);

2. 以下の 2 つの条件のどちらかが満たされる場合、呼び出される関数はメイン呼び出し関数内で宣言する必要はありません。

  • 呼び出される関数が呼び出し元の関数より前に定義されている場合
  • 呼び出された関数の戻り値の型が整数または文字の場合

5. 関数のネストされた呼び出し

C 言語の関数定義はすべて並列であり、互いに独立しています。つまり、関数を定義する場合、ある関数に別の関数の定義を含めることはできません。関数内で別の関数が呼び出される場合、それは関数のネストされた呼び出しと呼ばれます。つまり、呼び出された関数の処理中に、別の関数を呼び出すことができます。

おすすめ

転載: blog.csdn.net/m0_74102736/article/details/130446639