欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

《C primer plus》笔记:函数

程序员文章站 2023-12-22 21:32:10
...

20180606 qzd

1. 复习函数


  • 什么是函数:完成特定任务的独立程序代码单元
  • 函数的作用:省去重复多于代码,提高代码可读性,方便修改
  • 函数的构成:

函数原型:声明函数,告诉编译器函数的类型
函数调用:使用函数
函数定义:实现函数

int fun(char s); //声明函数

fun('a'); //调用函数

int fun(char s){
    return s;
}        //实现函数
  • 函数形参:局部变量,内部私有,每个变量要求声明类型
void show(int, int);   //也是合法的
  • 函数实参:实参是具体的值, 会赋值给形参
  • 返回值:测试函数的程序称为驱动程序,return语句会终止函数并把控制交给主调函数
  • 无参数:注意加void
void show(void);

2. 递归


  • 定义:C允许函数调用自己,这种调用称为递归
  • 演示:
#include <stdio.h>
int up_and_down(int);
int main(void){
 up_and_down(1);
 return 0;
}
int up_and_down(int n){
 printf("%d, %p\n", n, &n);
 if(n < 4)
 up_and_down(n+1);
 printf("%d, %p\n", n, &n);
}
// 1, 0060FF20
// 2, 0060FF00
// 3, 0060FEE0
// 4, 0060FEC0
// 4, 0060FEC0
// 3, 0060FEE0
// 2, 0060FF00
// 1, 0060FF20
  • 原理:

每次调用都有自己的变量,变量都是n但值不同
每次调用完之后都会返回一次,逐级返回
调用之前的顺序执行,调用之后的倒序返回
没有拷贝函数代码,可以代替循环,可以被i循环代替
必须包含让递归停止的语句

  • 尾递归:递归调用置于函数的末尾,相当于循环,能使用选择循环,莫使用递归(速度,内存优势)
  • 递归和倒序计算
  • 整数化二进制
void to_binary(int n){
     int r;
     r = n % 2;
     if( n >= 2 )
     to_binary( n/2 );
     printf("%d", r==0 ? 0 : 1);
}
  • 递归优缺点:为很多程序提供了简单的解决方案,但效率和消耗不令人满意

3. 多文件编译


  • 预处理和声明函数放在头文件中
  • 使用命令编译(linux)
gcc file1.c file2.c   //一起编译
gcc file1.c file2.o

4. 指针


  • 本质:值为内存地址的变量
  • 作用:存储变量的地址
  • 取地址符&:得到变量的地址 &a 表示a的地址
  • 解引用符*:找到存储在地址中的值 *&a ==> a
  • 用%p打印地址
  • 声明与赋值:严格区分开
int * pi;     //声明int型指针
pi = &a;      //给指针赋值
int *pi = &a; //上面两步合并成一步
b = *pi;      //获取pi所指向地址中存储变量的值并赋值给b
  • 使用指针在函数间通信:函数传值无法真正的改变实参的值,传地址可以改变实参的值。
  • 交换两个整数值:
#include <stdio.h>
void swap(int *, int *);
int main(void){
 int a = 1, b =2;
 swap(&a, &b);
 printf("%d, %d\n", a, b);
 return 0;
}
void swap(int *p, int *q){
 int temp;
 temp = *p;
 *p = *q;
 *q = temp;
}
  • 小训练1:10进制转任何进制
void to_base_n(int x, int n){
 int r;
 r = x%n;
 if(x >=  n)
 to_base_n(x/n, n);
 printf("%d", r );
}
  • 小训练2:Fibonacci递归与非递归
#include <stdio.h>
int fibonacciRec(int); //递归
int fibonacci(int);    //非递归
int main(void){
 int n;
 scanf("%d", &n);
 printf("%d\n", fibonacciRec(n) );
 printf("%d\n", fibonacci(n) );
 return 0;
}
int fibonacciRec(int n){
 if(n == 1 || n == 2)
 return 1;
 else
 return fibonacciRec(n-1) + fibonacciRec(n-2);
}
int fibonacci(int n){
 int i, fib1 = 1, fib2 = 1;
 if( n == 1 || n == 2)
 return 1;
 for(i = 3 ; i <= n; i++){
 fib2 = fib1 + fib2;
 fib1 = fib2 - fib1; 
 }
 return fib2;
}

参考:https://suoyuesmile.github.io/2015/07/04/c3/

上一篇:

下一篇: