理解に役立つC言語の基礎知識(詳しい機能)

目次

1. 関数とは何ですか

2. ライブラリ関数 

3. カスタム機能 

4. 関数パラメータ 

4.1 実パラメータ(実パラメータ) 

4.2 仮パラメータ(仮パラメータ) 

5. 関数呼び出し

5.1 値による呼び出し

5.2 アドレスによる呼び出し(パスアドレス)

6. 関数のネストされた呼び出しとチェーンされたアクセス 

6.1 ネストされた呼び出し 

6.2 チェーンアクセス 

7. 関数の宣言と定義 

7.1 関数宣言

 7.2 関数の定義


1. 関数とは何ですか

関数は、特定のタスクを実行するコードのブロックです。入力パラメータを受け入れ、値を返すことができます。関数によりコードのモジュール化、再利用が可能になり、コードの可読性と保守性が向上します。 


2. ライブラリ関数 

printf や scanf などの基本関数はビジネス コードではありません。C 言語の基本ライブラリは、移植性をサポートし、プログラムの効率を向上させるために、 プログラマによるソフトウェア開発を容易にする一連の同様のライブラリ関数を提供しています。

ライブラリ関数は、入出力、文字列処理、数学的計算などの一般的なタスクを実行するためにコンパイラまたはオペレーティング システムによって提供される関数です。追加の書き込みやコンパイルを行わずに、ライブラリ関数を直接使用できます。 

以下は、ライブラリ関数を使用して正弦を計算して出力するコード例です。

#include <stdio.h>
#include <math.h>

int main() {
    double angle = 30;
    double sinValue = sin(angle);
    printf("Sin value of %lf degrees: %lf\n", angle, sinValue);
    
    return 0;
}

その中で、さまざまなライブラリ関数とそれに対応するヘッダー ファイルは、cplusplus.comで参照できます  。

 

 C 言語には多くのライブラリ関数があるため、この記事では詳しく説明しません。今後詳しく解説する記事を書きたいと思います。


3. カスタム機能 

ユーザー定義関数: ユーザー定義関数は、要件に従ってプログラマによって作成される関数です。これらは特定のタスクを完了でき、関数名で呼び出して実行できます。カスタム関数はコード内でよく使用されるため、コードのモジュール性と再利用性が向上します。

  • ret_type は戻り値の型です。
  • fun_name はカスタム関数名です。
  • para1 は関数の仮パラメータです

2 つの整数の合計を計算するカスタム関数のサンプル コードを次に示します。

#include <stdio.h>

// 自定义函数,用于计算两个整数的和
int add(int a, int b) {
    return a + b;
}

int main() {
    int x = 5;
    int y = 10;
    
    int sum = add(x, y);
    printf("Sum: %d\n", sum);
    
    return 0;
}

4. 関数パラメータ 

4.1 実パラメータ(実パラメータ) 

関数の実際のパラメータは、関数が呼び出されたときに関数に渡される値です。実際の引数には、定数、変数、式、または他の関数の戻り値を指定できます。実パラメータの値は、関数内で使用するために関数の仮パラメータに渡されます。実際のパラメータの値は、関数の動作と結果に影響を与える可能性があります。 

4.2 仮パラメータ(仮パラメータ) 

仮パラメータは、関数定義で宣言された変数で、関数の呼び出し時に渡される実際のパラメータの値を受け取ります。仮パラメータは関数定義内のプレースホルダとして機能し、その値は関数が呼び出されたときに実際のパラメータによって提供されます。仮パラメータは関数内でのみ表示され、その有効範囲は関数内に限定されます。 

次のコード例は、さらに詳しく説明するために使用されます。 

#include <stdio.h>

// 函数定义,使用形式参数
void printSum(int a, int b) {
    int sum = a + b;
    printf("Sum: %d\n", sum);
}

int main() {
    int x = 5;
    int y = 10;
    
    // 函数调用,使用实际参数
    printSum(x, y);
    
    return 0;
}

上記のサンプル コードでは、 2 つの仮パラメータと をprintSum()受け取る という名前の関数を定義しました関数内で2 つの整数変数を宣言しそれらを実際のパラメーターとして関数に渡します。関数内では、仮パラメータ対応する値を受け取り、それらの合計が計算されます。最後に、関数の結果を出力します。 abmain()xyprintSum()printSum()ab

仮パラメータがインスタンス化された後は、実際には実パラメータの一時コピーと同等になることに注意してください。パラメータの値を変更したい場合、単純に値を渡すことはできません。


5. 関数呼び出し

5.1 値による呼び出し

値による呼び出しとは、関数が呼び出されたときに、実パラメータの値が仮パラメータにコピーされることを意味します。両者のアドレスは異なります。つまり、関数の仮パラメータと実パラメータはそれぞれ異なるメモリ ブロックを占有します。 、仮パラメータの変更は引数に影響しません。 

5.2 アドレスによる呼び出し(パスアドレス)

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

次に、コードを使用して詳細を説明します。

void changeValue(int *ptr) {
    *ptr = 10;
    printf("Inside function: %d\n", *ptr);
}

int main() {
    int x = 5;
    printf("Before function call: %d\n", x);
    
    changeValue(&x);
    
    printf("After function call: %d\n", x);
    
    return 0;
}

 これはアドレスによる呼び出しです。x の値が変更されたことが明確にわかります。

-------------------------------------------------- -------------------------------------------------- ------------------------- 

値渡し 

void changeValue(int ptr) {
    ptr = 10;
    printf("Inside function: %d\n", ptr);
}

int main() {
    int x = 5;
    printf("Before function call: %d\n", x);

    changeValue(x);

    printf("After function call: %d\n", x);

    return 0;
}

そして、値による呼び出しが見つかりました。これはまったく変更できません。前の説明と組み合わせると、より明確に理解できると思います


6.関数のネストされた呼び出しとチェーンアクセス 

6.1ネストされた呼び出し 

関数のネストとは、関数内で別の関数を呼び出すことを指します。この呼び出し方法では、関数のレイヤーごとのネストを実現でき、各関数が異なる関数を担当するため、コード構造がより明確でモジュール化されます。関数のネストされた呼び出しを通じて、複雑な問題をより小さなサブ問題に分解でき、これらのサブ問題は別の関数を呼び出すことで解決できます。 

int multiply(int a, int b) {
    return a * b;
}

int add(int a, int b) {
    return a + b;
}

int main() {
    int x = 5;
    int y = 3;
    
    int result = multiply(add(x, y), y);
    
    printf("Result: %d\n", result);
    
    return 0;
}

multiply()2 つの関数と が定義されておりadd()、それぞれ乗算と加算の演算を実装するために使用されます。main()関数内で2 つの整数変数を宣言しxyそれらを実際のパラメーターとしてadd()関数に渡します。add()関数によって返された結果x + y。この結果はmultiply()実パラメータとして関数に渡されます。最後に、multiply()関数によって返された結果result * y。この結果は変数に代入されます。result 

6.2チェーンアクセス 

ある関数の戻り値を別の関数のパラメータとして使用する 

printf("%d", printf("%d", printf("%d", 43)));
  •  最初の printf は 32 を出力し、戻り値は 2 です。
  • したがって、2 番目の printf は 2 を出力し、戻り値は 1 になります。
  • 3 番目の printf は 1 を約束します

7.関数の宣言と定義 

7.1 関数宣言

関数の宣言とは、関数を使用する前に、関数の名前、戻り値の型、パラメーター リストをコンパイラーに伝えることを指します。関数の宣言は通常、関数を使用する前に行われます。使用前の宣言を満たすために

 7.2 関数の定義

関数の定義は、関数の特定の実現を指し、関数の関数実現を説明します。

// 声明函数
int add(int a, int b);

// 定义函数
int add(int a, int b) {
    return a + b;
}

int main() {
    int x = 5;
    int y = 3;
    
    int result = add(x, y);
    
    printf("Result: %d\n", result);
    
    return 0;
}

function を宣言しadd()、関数の名前、戻り値の型、パラメーター リストをコンパイラーに伝えます。次に、この関数はソース ファイルで定義され、具体的な実装コードが提供されます。main()関数では、add()関数を呼び出し、2 つの実際のパラメータを渡しxy戻り値を変数に割り当てますresult最後に、main()関数で出力されたresult値 

関数の宣言と定義は、個別に行うことも、一緒にマージすることもできます。関数の宣言と定義が同じソースファイル内にあり、関数が前にある場合は、関数の宣言を省略して関数を直接定義できます。関数の宣言と定義が別のソースファイルに分かれている場合は、関数を使用する前に関数を宣言する必要があります。


今回は先に来たので、次回は関数再帰と配列について詳しく解説していきます。皆さん、ありがとうございました!! 

おすすめ

転載: blog.csdn.net/qq_74415153/article/details/132000029