【C语言】函数

2024-05-09 1159阅读

函数

  • 1.概念
  • 2.库函数
    • 2.1 标准库和头文件
    • 2.2 库函数的使用方法
      • 2.2.1 头文件包含
      • 3.自定义函数
        • 3.1 函数的语法形式
        • 4.形参和实参
          • 4.1 实参
          • 4.2 形参
          • 4.3 实参和形参的关系
          • 5.return语句
          • 6.数组做函数参数
          • 7.函数的声明和定义
            • 7.1 单文件
            • 7.2 多个文件
            • 7.3 static和extern
              • 7.3.1 static修饰局部变量
              • 7.3.2 static修饰全局变量

                函数)

                1.概念

                C语言中的函数就是一个完成某项特定的任务的一小段代码。

                2.库函数

                2.1 标准库和头文件

                C语言标准中规定了C语言的各种语法规则,C语言并不提供库函数;C语言的国际标准ANSI C规定了一些常用的函数的标准,被称为标准库,那不同的编译器⼚商根据ANSI提供的C语言标准就给出了一系列

                函数的实现。这些函数就被称为库函数。 printf 、 scanf 都是库函数,库函数的也是函数,不过这些函数已经是现成的,我们只要学会就能直接使用了。有了库函数,一些常见的功能就不需要程序员自己实现了,一定程度提升了效率;同时库函数的质量和执行效率上都更有保证。

                各种编译器的标准库中提供了一系列的库函数,这些库函数根据功能的划分,都在不同的头文件中进行了声明。

                库函数相关头文件:https://zh.cppreference.com/w/c/header

                2.2 库函数的使用方法

                库函数的学习和查看工具很多,比如:

                C/C++官方的链接:https://zh.cppreference.com/w/c/header

                cplusplus.com:https://legacy.cplusplus.com/reference/clibrary/

                2.2.1 头文件包含

                库函数是在标准库中对应的头文件中声明的,所以库函数的使用,务必包含对应的头文件,不包含是可能会出现一些问题的。

                3.自定义函数

                3.1 函数的语法形式

                ret_type fun_name(形式参数)
                {
                }
                
                 - ret_type 是函数返回类型
                 - fun_name 是函数名
                 - 括号中放的是形式参数
                 - {}括起来的是函数体
                
                1. ret_type 是用来表示函数计算结果的类型,有时候返回类型可以是 void ,表示什么都不返回
                2. fun_name 是为了方便使用函数;就像人的名字一样,有了名字方便称呼,函数有了名字方便调用,所以函数名尽量要根据函数的功能起的有意义。
                3. 函数的参数就相当于,工厂中送进去的原材料,函数的参数也可以是 void ,明确表示函数没有参数。如果有参数,要交代清楚参数的类型和名字,以及参数个数。
                4. { }括起来的部分被称为函数体,函数体就是完成计算的过程

                4.形参和实参

                在函数使用的过程中,把函数的参数分为,实参和形参。

                #include 
                int Add(int x, int y)
                {
                	int z = 0;
                	z = x+y;
                	return z;
                }
                int main()
                {
                	int a = 0;
                	int b = 0;
                	//输入
                	scanf("%d %d", &a, &b);
                	//调用加法函数,完成a和b的相加
                	//求和的结果放在r中
                	int r = Add(a, b);
                	//输出
                	printf("%d\n", r);
                	return 0;
                }
                

                4.1 实参

                在上面代码中,第2~7行是 Add 函数的定义,有了函数后,再第17行调⽤Add函数的。

                我们把第17行调用Add函数时,传递给函数的参数a和b,称为实际参数,简称实参。

                实际参数就是真实传递给函数的参数。

                4.2 形参

                在上面代码中,第2行定义函数的时候,在函数名 Add 后的括号中写的 x 和 y ,称为形式参数,简称形参。

                为什么叫形式参数呢?实际上,如果只是定义了 Add 函数,而不去调用的话, Add 函数的参数 x和 y 只是形式上存在的,不会向内存申请空间,不会真实存在的,所以叫形式参数。形式参数只有在函数被调用的过程中为了存放实参传递过来的值,才向内存申请空间,这个过程就是形式的实例化。

                4.3 实参和形参的关系

                虽然我们提到了实参是传递给形参的,他们之间是有联系的,但是形参和实参各自是独立的内存空间。

                例:

                #include 
                int Add(int x, int y)
                {
                	int z = 0;
                	z = x+y;
                	return z;
                }
                int main()
                {
                	int a = 0;
                	int b = 0;
                	//输入
                	scanf("%d %d", &a, &b);
                	//调用加法函数,完成a和b的相加
                	//求和的结果放在r中
                	int r = Add(a, b);
                	//输出
                	printf("%d\n", r);
                	return 0;
                }
                

                【C语言】函数

                在调试的可以观察到,x和y确实得到了a和b的值,但是x和y的地址和a和b的地址是不⼀样的,所以可以理解为形参是实参的一份临时拷贝。

                5.return语句

                • 在函数的设计中,函数中经常会出现return语句,这⾥讲一下return语句使用的注意事项。
                • return后边可以是一个数值,也可以是一个表达式,如果是表达式则先执行表达式,再返回表达式的结果。
                • return后边也可以什么都没有,直接写 return; 这种写法适合函数返回类型是void的情况。
                • return返回的值和函数返回类型不一致,系统会自动将返回的值隐式转换为函数的返回类型。
                • return语句执行后,函数就彻底返回,后边的代码不再执行。
                • 如果函数中存在if等分支的语句,则要保证每种情况下都有return返回,否则会出现编译错误。

                  6.数组做函数参数

                  在使用函数解决问题的时候,难免会将数组作为参数传递给函数,在函数内部对数组进行操作。

                  比如:写一个函数对将一个整型数组的内容,全部置为-1,再写一个函数打印数组的内容。

                  简单思考一下,基本的形式应该是这样的:

                  #include 
                  int main()
                  {
                  	int arr[] = {1,2,3,4,5,6,7,8,9,10};
                  	set_arr();//设置数组内容为-1
                  	print_arr();//打印数组内容
                  	return 0;
                  }
                  

                  这⾥的set_arr函数要能够对数组内容进行设置,就得把数组作为参数传递给函数,同时函数内部在设置数组每个元素的时候,也得遍历数组,需要知道数组的元素个数。所以我们需要给set_arr传递2个参数,一个是数组,另外一个是数组的元素个数。仔细分析print_arr也是一样的,只有拿到了数组和元素个数,才能遍历打印数组的每个元素。

                  #include 
                  int main()
                  {
                  	int arr[] = {1,2,3,4,5,6,7,8,9,10};
                  	int sz = sizeof(arr)/sizeof(arr[0]);
                  	set_arr(arr, sz);//设置数组内容为-1
                  	print_arr(arr, sz);//打印数组内容
                  	return 0;
                  }
                  

                  重点知识:

                  • 函数的形式参数要和函数的实参个数匹配
                  • 函数的实参是数组,形参也是可以写成数组形式的
                  • 形参如果是一维数组,数组大小可以省略不写
                  • 形参如果是二维数组,行可以省略,但是列不能省略
                  • 数组传参,形参是不会创建新的数组的
                  • 形参操作的数组和实参的数组是同一个数组

                    根据上述的信息,我们就可以实现这两个函数:

                    void set_arr(int arr[], int sz)
                    {
                    	int i = 0;
                    	for(i=0; i
                    		arr[i] = -1;
                    	}
                    }
                    void print_arr(int arr[], int sz)
                    {
                    	int i = 0;
                    	for(i=0; i
                    		printf("%d ", arr[i]);
                    	}
                    	printf("\n");
                    }
                    
                    	 if(((y%4==0)&&(y%100!=0)) || (y%400==0))
                    	 return 1;
                    	 else
                    	 return 0;
                    }
                    int main()
                    {
                    	int y = 0;
                    	scanf("%d", &y);
                    	int r = is_leap_year(y);//函数的调用
                    	if(r == 1)
                    	printf("闰年\n");
                    	else
                    	printf("非闰年\n");
                    	return 0;
                    }
                    
                    	int y = 0;
                    	scanf("%d", &y);
                    	int r = is_leap_year(y);//函数的调用
                    	if(r == 1)
                    	printf("闰年\n");
                    	else
                    	printf("非闰年\n");
                    	return 0;
                    }
                    //判断一年是不是闰年
                    int is_leap_year(int y)//函数的定义
                    {
                    	 if(((y%4==0)&&(y%100!=0)) || (y%400==0))
                    	 return 1;
                    	 else
                    	 return 0;
                    }
                    
                    	int y = 0;
                    	scanf("%d", &y);
                    	int r = is_leap_year(y);//函数的调用
                    	if(r == 1)
                    	printf("闰年\n");
                    	else
                    	printf("非闰年\n");
                    	return 0;
                    }
                    //判断一年是不是闰年
                    int is_leap_year(int y)//函数的定义
                    {
                    	 if(((y%4==0)&&(y%100!=0)) || (y%400==0))
                    	 return 1;
                    	 else
                    	 return 0;
                    }
                    
                    	return x+y;
                    }
                    
                    	int a = 10;
                    	int b = 20;
                    	//函数调用
                    	int c = Add(a, b);
                    	printf("%d\n", c);
                    	return 0;
                    }
                    
                    	int i = 0;
                    	i++;
                    	printf("%d ", i);
                    }
                    int main()
                    {
                    	int i = 0;
                    	for(i=0; i
                    		test();
                    	}
                    	return 0;
                    }
                    
                    	//static修饰局部变量
                    	static int i = 0;
                    	i++;
                    	printf("%d ", i);
                    }
                    int main()
                    {
                    	int i = 0;
                    	for(i=0; i
                    		test();
                    	}
                    	return 0;
                    }
                    
                    	printf("%d\n", g_val);
                    	return 0;
                    }
                    
                       printf("%d\n", g_val);
                       return 0;
                    }
                    
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]