4月从零学习C语言(第15天)——函数二

293 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第15天,点击查看活动详情

昨天我们学习了函数的定义调用和返回值,除了这些函数还有那些要注意的呢?

函数

函数原型

我们知道在C语言的编译器是自上往下分析你的代码的。

我们来看一段代码:

#include <stdio.h>
void sum(int begin, int end){
  int i;
  int sum =0;
  for ( i=begin; i<=end; i++ ) {
    sum += i;
  }
  printf( "%d到%d的和是%d\n", begin,end); 
}
int main( )
{
  sum(1,10);
  sum(20,30);
  sum( 35,45);
  
  return 0;
} 
#include <stdio.h>
void sum(int begin, int end){
  int i;
  int sum =0;
  for ( i=begin; i<=end; i++ ) {
    sum += i;
  }
  printf( "%d到%d的和是%d\n", begin,end); 
}
int main( )
{
  sum(1,10);
  sum(20,30);
  sum( 35,45);
  
  return 0;
} 

如果我们将sum函数放到main函数下面也不提前声明这个函数。会出现什么样的错呢?

#include <stdio.h>

int main( )
{
  sum(1,10);
  sum(20,30);
  sum( 35,45);
  
  return 0;
} 

void sum(int begin, int end){
  int i;
  int sum =0;
  for ( i=begin; i<=end; i++ ) {
    sum += i;
  }
  printf( "%d到%d的和是%d\n", begin,end); 
}

image.png 他会报错那么我们该如何解决呢这格式后就要用到函数原型了。

#include <stdio.h>
void sum(int begin, int end);//函数原型声明
int main( )
{
  sum(1,10);
  sum(20,30);
  sum( 35,45);
  
  return 0;
} 

void sum(int begin, int end){//函数定义
  int i;
  int sum =0;
  for ( i=begin; i<=end; i++ ) {
    sum += i;
  }
  printf( "%d到%d的和是%d\n", begin,end); 
}

这段代码中第二行叫做函数原型的声明,而第十二到十八行是函数的定义。

函数原型

函数头,以分号“;”"结尾,就构成了函数的原型

函数原型的目的是告诉编译器这个函数长什么样

  • 名称
  • 参数(数量及类型)
  • 返回类型

参数传递

如果函数有参数,调用函数时必须传递给它数量、类型正确的值

可以传递给函数的值是表达式的结果,这包括:

  • 字面量
  • 变量
  • 函数的返回值
  • 计算的结果

传值

我们之前编写过一个交换ab值的程序那么我们可不可以使用函数来实现这个功能呢?

#include <stdio.h>
void swap(int a, int b);
int main( )
{
  int a = 5;
  int b = 6;
  swap(a,b);
  printf( "a=%d b=%d\n",a,b);
  return 0;
}
void swap(int a, int b){
  int t = a;
  a = b;
  b = t;
}

结果:

image.png 我们发现a和b的值并没有交换,这是因为C语言在调用函数是,永远只能传值给函数。

我们可以理解为每个函数有自己的变量空间,参数也位于这个独立的空间中,和其他函数没有关系

对于函数参数表中的参数,叫做“形式参数”,调用函数时给的值,叫做“实际参数”

本地变量(局部变量)

函数的每次运行,就产生了一个独立的变量空间,在这个空间中的变量,是函数的这次运行所独有的,称作本地变量

定义在函数内部的变量就是本地变量

形式参数也是本地变量

变量的生存期(生命周期)和作用域

生存期:什么时候这个变量开始出现了,到什么时候它消亡了

作用域:在(代码的)什么范围内可以访问这个变量(这个变量可以起作用)

对于本地变量,这两个问题的答案是统一的:大括号内——块

本地变量的规则

本地变量是定义在块内的

  • 它可以是定义在函数的块内
  • 也可以定义在语句的块内
  • 甚至可以随便拉一对大括号来定义变量

程序运行进入这个块之前,其中的变量不存在,离开这个块,其中的变量就消失了

块外面定义的变量在里面仍然可以调用

块里面定义了和块外面同名的变量则会覆盖外面的

不能再一个块内定义同名的变量

本地变量不会被默认初始化

参数在进入函数是会被初始化