第二站:c/c++基础-函数

函数

为什么使用函数

1."避免重复制造轮子",提高开发效率

2.便于维护

函数的定义

函数的设计

        1.先确定函数的功能

        2.确定函数的参数(是否需要参数,参数的个数,参数的类型)

                实参:调用函数时,传入的参数

                形参:定义函数时,设置的参数,函数的形参在未被调用前是不分配空间,再调用的时候分配                           空间,调用结束后又释放空间

        3.确定函数的返回值(是否需要返回值,返回值得类型)

        4.确定函数名(函数名一定要顾名思义)

        5.函数名的命名方法和变量类似

例如:

#include 

using namespace std;

/*

   	1.先确定函数的功能
    2.确定函数的参数(是否需要参数,参数的个数,参数的类型)
    3.确定函数的返回值(是否需要返回值,返回值得类型)
    4.确定函数名(函数名一定要顾名思义)
    5.函数名的命名方法和变量类似
*/

int sum(int n) {//函数的定义,需要参数,个数一个,类型int
	int sum = 0;
	for (int i = 0; i <= n; i++)
	{
		sum += i;
	}
	cout << n << "的累加和为" << sum << endl;
	return sum; //需要返回值
}
int main(void) {


	int i = sum(100);//函数的调用,函数的返回值赋值给i
	int j = i + 100;//用函数的返回值加100
	cout << j << endl;

	return 0;
}

第二站:c/c++基础-函数_第1张图片

函数的声明:

"函数的声明"在多模块的开发中使用很多(一般搭配.h头文件使用)

他的作用就类似于去定位函数的位置

如果用户使用自己定义的函数,但是该函数与调用它的函数(即主调函数)不在同一文件中,或者函数定义的位置在主调函数之后,那么就必须在调用此函数之前对被调用的函数作声明。让主函数在编译的时候能够去发现定义的函数

例如:

第二站:c/c++基础-函数_第2张图片

函数的值传递

值传递:"i"的值在调用sum函数时,实参的"i"将作为形参的"i"被带入sum的函数体内进行赋值,

但是当sum函数体执行完后形参被释放,"i"作为形参而改变的值也被释放,

"i"作为实参的值并没有得到改变.

第二站:c/c++基础-函数_第3张图片

数组作为函数的参数

当地址作为实参传递时,他本身传递的是一个地址,函数在获取到实参数组传递的地址时,形参数组也会把该地址作为自己的起始地址去进行函数体内部的赋值,此时形参数组和实参数组是占用的同一段内存,所以,在函数修改形参数组值得时候,实参数组的值也会跟着一起改变

第二站:c/c++基础-函数_第4张图片

#include 

using namespace std;

void findScore(int score[], int n ) {//传入数组的时候,本质传入的就是一个地址
	for (int i = 0; i < n; i++)
	{
		cout << score[i]<<" ";
	}
	cout << endl;
}
void addScore(int score[], int n, int add) {
	for (int i = 0; i < n; i++)
	{
		score[i] += add;
		cout << score[i]<<" ";
	}
	cout << endl;
}

int main(void) {

	int score[3] = { 60,70,80 };//数组名本身就是一个地址

	findScore(score, 3);
	addScore(score, 3, 5);
	findScore(score, 3);

	return 0;
}

默认参数(C语言是不支持默认参数的)

默认参数是在形参列表之后的一个确定数值,他的定义不会对函数的调用照成影响

如:

第二站:c/c++基础-函数_第5张图片

 函数的重载(C语言不支持函数重载)

调用函数时,函数的实参会根据自己的类型找对应的函数的形参类型的函数,进行调用

是根据形参的类型和个数来进行匹配

要求:

函数名相同,

但是, 函数的参数(形参)绝不相同:

1) 参数个数不同

2) 或参数个数相同, 但是参数的类型不同

只有返回类型不同,不能构成函数重载 只有形参变量名不同, 不能构成函数重载.

函数的栈空间:

要避免栈空间溢出。 当调用一个函数时,就会在栈空间,为这个函数,分配一块内存区域, 这块内存区域,专门给这个函数使用。 这块内存区域,就叫做“栈帧”。

第二站:c/c++基础-函数_第6张图片

当我们分配的数据过大就会,栈空间溢出

0x00007FF6076F1BB7 处(位于 循环练习.exe 中)引发的异常: 0xC00000FD: Stack overflow (参数: 0x0000000000000001, 0x000000316AE83000)。

第二站:c/c++基础-函数_第7张图片

内联函数:相当于将函数在调用位置进行重写

函数的缺点: 每调用一次函数,就会为这个函数分配一个“栈”, 在计算机底层做很多准备工作(保护原来的执行环境,切换到新的执行环境) 有一定的“时间开销"

优点:

        可以节省每次调用这个函数所消耗的栈空间,避免调用函数时的开销,节省调用时间

缺点:

        他会是得调用函数的本函数变得十分"臃肿",消耗了调用函数的本函数的栈空间

适用:

        函数本身比较简单且执行很快的(例如调用函数的开销时间大于这个函数的函数体执行时间)或者执行频度非常高的函数

例如:

在函数前面加一个inline关键字

第二站:c/c++基础-函数_第8张图片

递归函数

 第二站:c/c++基础-函数_第9张图片

#include 

using namespace std;

inline void test( int n  ) {
	
	if (n > 5) {
		return;
	}
	cout << "进入第" << n << "层梦境!" << endl;
	test(n + 1);

	cout << "退出第" << n << "层梦境!" << endl;

}


int main(void) {

	test(1);
	return 0;
}

你可能感兴趣的:(c++,c语言,算法)