C言語基礎 - 関数(on)

目次

1. 関数とは何ですか

2. 機能の分類

1. ライブラリ関数

2. カスタム機能

3. 関数パラメータ

1. 仮パラメータ定義

2. 実パラメータの定義

3. 実際の参加と形式的パラメータの関係 

 4. 関数呼び出し

1. 値による呼び出し

2.アドレスで電話をかける

3. 選び方

5. まとめ


1. 関数とは何ですか

関数と言えば真っ先に思い浮かぶのは間違いなく数学の関数ですが、この関数の問題は数学において私たちを死ぬほど苦しめると言っても過言ではありません。しかし、 C言語にも数学関数と多くの類似点を持つ関数がありC言語を学習する上で習得しなければならない知識でもあることをご存知ですか

関数定義

C 言語の関数は、特定の関数を独立して完了するために再利用できるコードの一部です。ユーザーによって渡されたパラメータを受け取ることも、受け取らないこともできます。コード セクションを関数にカプセル化するプロセスは、関数定義と呼ばれます戻り値がある場合は、関数本体のreturn ステートメントを使用して戻り値を返します。返されるデータの型は、受信した値のデータ型と同じである必要があります。

2. 機能の分類

  • ライブラリ関数
  • カスタム関数

1. ライブラリ関数

ライブラリ関数とは何ですか?

C 言語標準では次のように規定されています。

  • 関数の関数
  • 関数名
  • パラメータ
  • 戻り値の型 

この一連の関数は、コンパイラメーカーがこの規定に基づいて作成し、標準ライブラリに組み込んだものであるため、ライブラリ関数と呼ばれます

よく使用されるscanf、printf、strlenなどのコンパイラに付属する関数は 、すべてライブラリ関数です。

C 言語のすべてのライブラリ関数を紹介する友人向けの Web サイトは次のとおりです: https://cplusplus.com/reference/

C 言語でよく使われるライブラリ関数は次のとおりです。

  • I/O機能
  • 文字列操作関数
  • 文字操作関数
  • 記憶操作機能
  • 時刻/日付関数
  • 数値関数
  • その他のライブラリ関数

 同様の機能を持つ一部のライブラリ関数は同じヘッダー ファイルに配置されるため、これらのライブラリ関数を使用する場合は、最初にそれらのヘッダー ファイル (一般的に使用される <stdio.h>、< string.h > 、 <time.h>など。

2. カスタム機能

ライブラリ関数は使いやすいですが、プログラミングのニーズをすべて満たせるわけではなく、現時点ではプログラマが関数を定義する必要

カスタム関数の構成:

ret_type fun_name ( para1 ,*)

{

ステートメント;//ステートメント項目

}

ret_type 戻り値の型

fun_name 関数名

para1 関数パラメータ

ここでは、関数を詳しく説明するための例を示します。

 加算演算を実装する関数を作成します。

#include<stdio.h>
int Add(int x,int y)
{
    int sum = 0;
    sum = a + b;
    return sum;
}
int main()
{
    int a = 2;
    int b = 5;
    int sum = Add(a,b);
    printf("%d",sum);
    return 0;
}

上記の関数と同様に、この関数の戻り値の型はintであり、この関数の戻り値が整数であることを意味します。このとき、合計を具体的に返すには return を使用する必要があります。

ここで注意すべき点は、関数の戻り値が空でない場合、戻り値を受け取るには、戻り値と同じ型の変数を main 関数で定義する必要があることです

Addは関数名です他の人が関数の内容を理解しやすいように、この関数で実現される関数の英語名を使用するようにしてください。

int x 、 int y は、この関数に必要な2 つのパラメータであり、に渡された値を受け取り、関数ステートメントで演算を使用するために使用されます。

その中で、次の関数のように、関数の戻り値の型とパラメーターは実際のニーズに応じてオプションです。

#include<stdio.h>

void print()
{
    printf("hello world!");
}
int main()
{
    fun();
    return 0;
}

関数の戻り値の型はvoidにすることもできます。つまり、値を返さないことになります

パラメータなしで「hello world!」を出力する機能を実装することも可能です

3. 関数パラメータ

関数パラメータは 2 つのタイプに分類されます。

  • 仮パラメータ
  • 実際のパラメータ

1. 仮パラメータ定義

  • 仮パラメータは、関数名の後に括弧で囲まれた変数です。
  • したがって、仮パラメータは関数が呼び出されたときにのみインスタンス化されるため、仮パラメータと呼ばれます。
  • 仮パラメータは関数呼び出しの完了後に自動的に破棄されるため、仮パラメータは関数内でのみ有効です

2. 実パラメータの定義

  • 実際に関数に渡されるパラメータを実パラメータと呼びます。
  • 実際のパラメータは、定数、変数、式、関数などです。
  • 実際のパラメータがどのような種類の量であるかに関係なく、関数が呼び出されるとき、それらの値は仮パラメータに転送できるように、明確な値を持っている必要があります。

3. 実際の参加と形式的パラメータの関係 

2 つの整数を交換する関数を作成します。

#include<stdio.h>
void Swap(int x, int y)
{
	int temp = x;
	x = y;
	y = temp;
}
int main()
{
	int a = 2;
	int b = 5;
	Swap(a, b);
	printf("%d %d", a, b);
}

皆さん、この関数は本当に a と b の値を交換できるのでしょうか?

 答えはいいえだ。

どうしてこれなの?? ?

上記の関数定義で定義した x と y は仮パラメータと呼ばれ、関数に渡される a と b は実パラメータと呼ばれます。

上の図を見てみましょう。x と y にそれぞれ a と b の値を受け取らせますが、それらのアドレスは同じではないことに気づきましたか。

main も関数であることを忘れないでください異なる関数で作成された変数のアドレスは決して同じではないのでx と y は a と b の値のみを受け取りますが、a のアドレスは受け取りません。と b を受け取ります

この変数の値を関数外のアドレスから変更しない場合、変数自体の値は変更されません

したがって、仮パラメータは実際のパラメータの一時的なコピーにすぎず仮パラメータを変更しても実パラメータには影響しません

では関数による交流は実現できないのでしょうか?? ?

もちろん、さまざまな関数の値を変更するにはアドレスが必要なので、アドレスを使用して操作します。

#include<stdio.h>
void Swap(int* x, int* y)
{
	int temp = *x;
	*x = *y;
	*y = temp;
}
int main()
{
	int a = 2;
	int b = 5;
	Swap(&a, &b);
	printf("a = %d b = %d", a, b);
}

上記の関数の場合、ポインタは変数のアドレスを直接受け取ること操作されることがわかっているので、関数の仮パラメータを 2 つのポインタ変数として定義し&a と &b の2 つのアドレスを関数に渡します。受信し、2 つのポインター変数の値を交換することで簡単に実行できます。

 このときのxとyのアドレスを見てみますが、aとbは同じでしょうか?

 4. 関数呼び出し

1. 値による呼び出し

  • 値による呼び出しは、その名前が示すように、関数に値を渡すことです。
  • 特徴:関数の仮パラメータと実パラメータは異なるメモリ ブロックを占有し仮パラメータを変更しても実パラメータには影響しません

例は次のとおりです。 

#include<stdio.h>
void Swap(int x, int y)
{
	int temp = x;
	x = y;
	y = temp;
}
int main()
{
	int a = 2;
	int b = 5;
	Swap(a, b);
	printf("%d %d", a, b);
}

2.アドレスで電話をかける

  • アドレスによる呼び出しとは、関数の外で作成した変数のメモリアドレスを関数の引数に渡すことで関数を呼び出す方法です。
  • パラメーターを渡すこの方法により、関数は関数の外部の変数と実際の接続を確立できます。つまり、関数は関数の外部変数を直接操作できます

 例は次のとおりです。

#include<stdio.h>
void Swap(int* x, int* y)
{
	int temp = *x;
	*x = *y;
	*y = temp;
}
int main()
{
	int a = 2;
	int b = 5;
	Swap(&a, &b);
	printf("a = %d b = %d", a, b);
}

3. 選び方

では、値で渡すかアドレスで渡すかをどのように区別して選択すればよいのでしょうか? ? ?

非常に簡単です。関数の操作で実際のパラメータを変更する必要がある場合は、参照による呼び出しを使用します。実際のパラメータを変更する必要がない場合は、値による呼び出しを使用しますさまざまなアプリケーション シナリオで正しい選択を行う方法を学びます。

5. まとめ

関数の知識 (パート 1) は今回で終了となります。関数の知識 (パート 2) の内容を少しだけ見てみましょう。

  • ネストされた呼び出しと関数の連鎖アクセス
  • 関数の宣言と定義
  • 関数の再帰

ブロガーの記事に質問や知識の追加がある場合は、お気軽にプライベート メッセージにコメントしてください。

ブロガーの記事が気に入ったお友達は、忘れずに3 回クリックしてください。次号でお会いしましょう!

おすすめ

転載: blog.csdn.net/2303_78442132/article/details/132257049