瘦瘦的第四颗桃子(函数)

函数
函数中主要是一些用法和递归的使用
1.函数是啥
函数就是子程序,负责完成某项特定任务,具有相对的独立性。
2. 库函数
(1)为了支持可移植性和提高效率,c语言提供了一些库函数,比如我们经常使用的printf和 scanf
(2)而为了查看这些库函数的作用我们有一个网站www.cplusplus.com
(3)但是要注意的一点就是在使用库函数时,头文件要有**#include**。
3.自定义函数
自定义函数就是程序猿自己定义想要实现一定功能的函数。有函数名,返回值和参数类型。
下面一个例子

#include<stdio.h>
void Swap1(int i,int j)
{
	int temp=0;
	temp=i;
	i=j;
    j=temp;
}
void Swap2(int *px,int *py)
{
	int temp=0;
	temp=*px;
	*px=*py;
    *py=temp;
}
int main()
{
	int i=7;
	int j=8;
	Swap1(i,j);
	printf("swap1:%d,%d",i,j);
	Swap2(&i,&j);
	printf("swap2:%d,%d",i,j);
	return 0;
}

第一个Swap1函数的值为7,8;而第二个才为8,7。
这里注意:
(1)函数传参时必定要形成一个临时变量。
(2)这个程序函数一是传值传参在函数中只是将形成的两个临时变量进行交换,并没有将主函数中的进行交换,只有函数二传址传参创建指针变量才能将主函数中的变量进行交换。
4.函数的参数
函数的参数有实际参数和形式参数

  • 实际参数是进行函数调用时确定的值,将这些值传给形参。可以是常量,变量,表达式,函数等。
  • 形式参数是函数名括号后的变量,它只在函数中有效,并且系统会在中开辟一个栈帧来存放变量,函数调用完之后会释放。
    5.函数的调用
    (1)传值调用
    形参和实参有各自的内存块,形参不会影响实参
    (2)传址调用
    顾名思义,是将实参的地址传给形参,而这种发法才能真正实现用子程序中的变量操作主程序中的变量。
    6.函数的嵌套调用和链式访问
    嵌套调用,比如说
#include <stdio.h>
void print()
{
	printf("我最美!!!");
}
void fun()
{
	int i=0;
	for(i=0;i<4;i++)
	{
		print();
	}
}
int main()
{
	fun();
	return 0;
}

链式调用
比如说

#include<stdio.h>
int main()
{
	printf("%d",printf("%d",printf("%d",43)));
	return 0;
}
	

结果为4321,原因是printf函数返回值是整型,返回值是字符的个数。
注意:一般不要用链式调用,容易出错。

7.函数的声明和定义
注意:!!!函数可以声明很多次,但只能定义一次
一般情况下要先声明后使用
下面注意一下声明
(1)text.h的内容(头文件)

#ifndef _TEST_//test是宏
#define_TEST_//以上都是固定格式
声明函数部分
#endif

(2)text.c的内容(源文件)

#include"text.h"
实现函数部分

8.递归!!!
递归就是自己调用自己,直接调用或者间接调用。
使用递归的条件:一是当一个算法很多步骤都一样时使用递归可以更加简单,二是有一个条件使得递归不再进行。
举个例子

#include<stdio.h>
void  output(int a)
{
	if (a>9)
	{
		output(a/10);
	}


			printf("%d",a%10);
	
}
int main()
{
	int a=1234;
	output(a);
	return 0;
}

再比如求地n个斐波那契数

#include<stdio.h>
int fib(int n)
{
	if(n<=2)
		return 1;
	else 
		return fib(n-1)+fib(n-2);
	
}
int main()
{
   int b=5;
   int sum;

	sum=fib(b);
	printf("%d",sum);
	return 0;
}

这里需要注意,如果程序中b的值过大,会导致内存中分配给函数中变量栈的空间满了,会形成溢出,所以为了不占用空间,下面用迭代法。

#include<stdio.h>
int fib(int n)
{
	int sum=0;
	int first;
	int second;
	second=first=1;
	while(n>2)
	{
		
	sum=first+second;
	first=second;
	second=sum;
	
	n--;
	}
		return sum;
}
int main()
{
	int b=5;
	int sum=fib(b);
	printf("%d",sum);

	return 0;
}

注意:

  1. 递归的优缺点:
  • 代码简单
  • 占用内存和空间,效率低
  1. 迭代优缺点
  • 代码较为繁琐
  • 省内存空间,并且效率高很多,尤其要递归较多次数的

3.能用迭代的时候,尽量不要用递归

扫描二维码关注公众号,回复: 6208061 查看本文章

9.总结
(1)int* p而不给其赋值,这是一个野指针
预防野指针int* p=NULL,NULL的值在c中为0。

猜你喜欢

转载自blog.csdn.net/shoushou_/article/details/90123396