函数

1、C语言中函数的分类:库函数自定义函数

2、C语言常用的库函数:

重新学习C语言day05_重新学习C语言

举例:

  char arr1[20]={0};
  char arr2[]="hello world";
  char arr3[]={0};

  strcpy(arr1, arr2);
  memset(arr2, '*', 6);
  printf("%s/n",arr1);
  printf("%s/n",arr2);

3、自定义函数(声明后才能调用)

函数的组成:

ret_type fullname(para1,)
{
   statements;
}
//不写类型默认返回int型

举例:

  int get_max(int a, int b)
  {
    int z=0;
    if(a>b) return a;
    else return b;
  }
int main()
{
  int max = get_max(20, 10);
  printf("%d",max);
  return  0;
}
void swap(int* a , int* b)
  {
    int c = 0;
    c=*a;
    *a=*b;
    *b=c;
  }
int main()
{
  int x=10;
  int y=20;
  printf("交换前:x:%d,y:%d/n",x,y);
  swap(&x,&y);
  printf("交换后:x:%d,y:%d/n",x,y);
  return  0;
}

4、函数的参数

1)实际参数(实参):真实传给函数的参数。实参可以是:常量、变量、表达式和函数等。  —->必须有确定的值

2)形式参数(形参):函数名后括号中的变量,只有在函数被调用的过程中才实例化。         —->调用完成后自动销毁

形参实例化后相当于实参的一份临时拷贝

5、函数的调用

1)传值调用:函数的形参和实参分别占有不同的内存块,对形参的修改不会影响实参

2)传址调用:把函数外部创建变量的内存地址传递给函数参数

6、函数的嵌套调用、链式访问

1)函数可以嵌套调用,但是不能嵌套定义!

2)链式访问即为把一个函数的返回值作为另一个函数的参数

举例:

 printf("%d",printf("%d",printf("%d",43)));

返回:4321

7、函数的声明和定义

1)函数声明:

    a.告诉编辑器有一个函数叫什么,参数是什么,返回类型是什么。具体函数存不存在无关紧要

    b.先声明后使用

    c.函数的声明一般要放在头文件中     —>放在双引号里,在.h里声明,.c中实现

2)函数定义:是指函数的具体实现,交待函数的功能实现

int main()
{
 int a = 10;
  int b = 20;
  int Add1(int, int);     //函数声明
  int c = Add1(a, b);
  printf("%d",c);
}
int Add1(int x, int y)   //函数定义
{
  return x+y;
}

8、函数递归

程序调用自身的技巧称为递归。递归作为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或者说明中有直接或者间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来解决,递归策略只需要少量的程序就能描述出解题过程中所需要的多次重复计算,大大减少了代码量。递归的主要思考方式在于:把大事化小

递归的两个必要条件

1)存在限制条件,当满足这个限制条件时,递归不再继续

2)每次递归调用之后越来越接近这个条件

举例:接收一个无符号整形,打印它的每一位。

void print(unsigned int n)
{
  if (n > 9)
  {
    print(n / 10);
  }
  printf("%d", n % 10);
}
int main()
{
  unsigned int num = 0;
  scanf("%u", num);
  print(num);
  return 0;
}

举例:编写函数不允许创建临时变量,求字符串的长度。

int my_strlen(char *str)
{
  if (*str != '/0')
    return 1 + my_strlen(str + 1);
  else
    return 0;
}
int main()
{
 char arr[] = "hello";
  printf("%d", my_strlen(arr));
  return 0;
}

 举例:求n的阶乘(不考虑溢出)

int factorial(int n)
{
  if (n <= 1)
    return 1;
  else
    return n * factorial(n - 1);
}
int main()
{
  int n = 0;
  scanf("%d", &n);
  int ret = factorial(n);
  printf("%d", ret);
  return 0;
}

举例:求第n个斐波那契数(不考虑溢出) 

//重复计算太多,效率太低!
int fib(int n)
{
  if (n <= 2)
    return 1;
  else
    return fib(n - 1) + fib(n - 2);
}
int main()
{
  int n = 0;
  scanf("%d", &n);
  int ret = fib(n);
  printf("%d", ret);
  return 0;
}
int FIB(int n)
{
  int a = 1;
  int b = 1;
  int c = 1;
  while (n > 2)
  {
    c = a + b;
    a = b;
    b = c;
    n--;
  }
  return c;
}
int main()
{
  int n = 0;
  scanf("%d", &n);
  int ret = FIB(n);
  printf("%d", ret);
  return 0;
}