完全な C 言語関数

この記事ではナンセンスな話はしません、要点だけを切り取ってください



序文

函数说白了就是子程序,对代码的细节进行封装隐藏,也可以让代码重复使用

C 言語では関数がよく使われます。プロジェクトを作成するときに、すべてのコードを main 関数に記述してはなりません。すべてのコードを main 関数に記述すると、コードが再利用できなくなり、コードの可読性が低下します。貧乏になる。
コードを関数にカプセル化すると、コードを再利用できるという利点があります。


1. C言語における関数の分類

関数はライブラリ関数とカスタム関数に分かれています

1. ライブラリ関数

なぜ図書館への手紙があるのですか?
主にコーディングの効率を向上させるために、まず一般的に使用されるものを取り上げます。printf印刷関数たとえば、printf ライブラリ関数が存在しない場合、関数関数を自分でカスタマイズする必要がありますが、このプロセスは時間の無駄です。時間は効率であることは誰もが知っていますが、ライブラリ関数の登場はコードの効率を向上させるだけです。

2. カスタム機能

ライブラリ関数がすべてを実行できる場合、プログラマは何をする必要があるでしょうか?
カスタム関数はさらに重要です。
ライブラリ関数と同様に、カスタム関数には関数名、戻り値の型、および関数パラメーターがあります。
しかし、違うのは、これらはすべて私たち自身が設計したものであるということです。これにより、プログラマーには多くの余地が与えられます。
関数の構成:

コードは次のとおりです(例)。
比较大小功能函数

後ほど詳しく紹介します

接下来介绍自定义函数的组成

int max(a,b)		
{
    
    
	//这种比较大小只能用在两数之间,不能给多组数比较
	if(a>b)				//第一种方法
	{
    
    
	return a;			//返回值得跟返回类型一致
	}
	else
	{
    
    
	return b;
	}

	return (a>b)?a:b;		//第二种方法比较简洁			
}


int main()
{
    
    
	int a = 12;
	int b = 10;
	max(a,b);		//函数传参
	return 0;		//不写程序一样可以运行
}


返回类型分为有返回值跟无返回值

//有返回值先拿int类型做示范
int max(a,b)	//max函数名可自定
				//(a,b)形参
//void是无返回类型
void a(a,b)

3. 機能構成と留意すべき点

重点:函数先声明在使用,例外条件是函数在main函数之前就不用先声明后使用

カスタム関数の名前はカスタマイズ可能で、戻り値は戻り値の型と一致しており、戻り値の型は関数の内容に応じて返され、通常は void が使用されます。

次に、関数のパラメータ

関数の引数は実引数と仮引数に分かれますが、実引数と仮引数の違いについて説明します。

実パラメータと仮パラメータの実際の違いや、それを詳しく理解していないとどのような影響があるのか​​、初心者にとっては混乱してしまうと思いますので、ここで詳しく説明します。

これには、関数の値による呼び出しと参照による呼び出しの違いが関係します。

関数パラメータは実パラメータと仮パラメータに分かれます。

関数を呼び出すとき、メイン関数はカスタム関数にパラメータを渡す必要があります。関数には実際の参加形式があります。メイン関数での値の受け渡し操作は実パラメータであり、カスタム関数の値の受け取り操作は仮パラメータであり、仮パラメータは実パラメータです。パラメータの一時コピーや仮パラメータの変更は、実パラメータに実際の影響を与えません。


1. スタック、ヒープ、クワイエットエリアの概要

ここに画像の説明を挿入

機能を理解するのに良い


2. 実パラメータと仮パラメータの重要な導入

率直に言うと、実パラメータと仮パラメータはすべて独立したメモリ ブロックを占有するので、仮パラメータを使用して実際のパラメータ値を変更したいと考えます。渡されたアドレスはポインタで受け取る必要があるため、変更する値のアドレスを Swap 関数に渡してポインタで受け取る必要があるため、実パラメータを使用する必要があります。

接下来代入代码


代码完整实例

次に、コードを使用して値による呼び出しと参照による呼び出しの違いを指摘します。2つの数字を交換する例として紹介したのは

正确代码

void Swap(int*x,int*y)//形参
{
    
    
	int tmp = *x;
	*x = *y;
	*y = tmp;
}

int main()
{
    
    

	int a = 10;
	int b = 20;
	Swap(&a,&b);//实参
	printf("%d %d", a, b);
	return 0;
}

错误代码

void Swap(int*x,int*y)//形参
{
    
    
	int tmp = *x;
	*x = *y;
	*y = tmp;
}

int main()
{
    
    

	int a = 10;
	int b = 20;
	Swap(a,b);//实参
	printf("%d %d", a, b);
	return 0;
}

aとbの値のアドレスが渡されていないため、Swap関数におけるaとbの値の交換は無効です 上記を振り返ると、実際の参加仮パラメータは独立したメモリブロックを持っており、変更は仮パラメータによる実パラメータの値は無効です。はい、a と b のアドレスを渡して、ポインタで受信して変更する必要があります。

3. 実際のパラメータ

int main()
{
    
    

	int a = 10;
	int b = 20;
	Swap(&a,&b);//实参
	printf("%d %d", a, b);
	return 0;
}

4、形参

void Swap(int*x,int*y)//形参
{
    
    
	int tmp = *x;
	*x = *y;
	*y = tmp;
}

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

5.1. ネストされた呼び出し

実行順序は main の前から開始し、後方に実行します。呼び出し規則は同じです。print 関数を呼び出すときは、a 関数の前になければなりません。そうしないとエラーが報告されます。

#include <stdio.h>
void print()
{
    
    
 printf("hehe\n");
}
void a()
{
    
    
    int i = 0;
 for(i=0; i<3; i++)
   {
    
    
       print();
   }
}
int main()
{
    
    
 print();
 return 0;
}

5.2. チェーンアクセス

ある関数の戻り値を別の関数の引数として使用します。

#include <stdio.h>
#include <string.h>
int main()
{
    
    
    char arr[20] = "hello";
 int ret = strlen(strcat(arr,"world"));		//字符拼接,然后计算字符串长度,从最里面的依次向外。
 printf("%d\n", ret);
 return 0;
}

6. 関数の宣言と定義

6.1. 関数宣言

関数の名前、パラメータ、戻り値の型をコンパイラに伝えます。関数宣言の具体的な存在は判断できません。関数宣言は通常、mian 関数の前にあり、最初に宣言する必要があり
ます。関数宣言は通常
、ヘッダー ファイルに配置されます。


6.2. 関数の定義

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

おすすめ

転載: blog.csdn.net/m0_66977204/article/details/130647560