C 函数

函数(Function) 是一段可以重复使用的代码,用来独立地完成某个功能。

函数的定义、调用与参数传递

函数定义和调用

函数(Function) 是一段可以重复使用的代码,用来独立地完成某个功能。

函数可以接收用户传递的数据,也可以不接收;接收用户数据的函数在定义时要指明参数,不接收用户数据的不需要指明。 根据这一点,可以将函数分为有参函数无参函数

将代码段封装成函数的过程叫做函数定义。

C语言 无参函数的定义

如果函数不接收用户传递的数据,那么定义时可以不带参数,它的语法格式如下:

dataType  functionName(){  
    //body  
}
  • dataType 是返回值类型,它可以是C语言中的任意数据类型,例如 int、float、char 等。
  • functionName 是函数名,它是标识符的一种,命名规则和标识符相同。函数名后面的括号( )不能少。
  • body 是函数体,它是函数需要执行的代码,是函数的主体部分。即使只有一个语句,函数体也要由{ }包围。
  • 如果有返回值,在函数体中使用 return 语句返回。return 出来的数据的类型要和 dataType 一样。

例如,定义一个函数,计算从 1 加到 100 的结果:

int sum(){
    int i, sum=0;
    [for](https://c.biancheng.net/view/1811.html)(i=1; i<=100; i++){
        sum+=i;
    }
    return sum;
}
int main(){
    //调用函数 sum,并将返回值赋值给变量 a(或者说用变量 a 接收函数 sum 的返回值)
    int a = sum();
    [printf](https://c.biancheng.net/view/ublxqif.html)("The sum is %d\n", a);
    return 0;
}

return 是C语言中的一个关键字,只能用在函数中,用来返回处理结果。

函数不能嵌套定义,main 也是一个函数定义,所以要将 sum 放在 main 外面。函数必须先定义后使用,所以 sum 要放在 main 前面。

ATTENTION main 是函数定义,不是函数调用。当可执行文件加载到内存后,系统从 main 函数开始执行,也就是说,系统会调用我们定义的 main 函数。

无返回值函数

有的函数不需要返回值,或者返回值类型不确定(很少见),那么可以用 void 表示。如:

void hello(){
    printf ("Hello,world \n");
    //没有返回值就不需要 return 语句
}

void 是C语言中的一个关键字,表示 “空类型”或“无类型”,绝大部分情况下也就意味着没有 return 语句。

C语言 有参函数的定义

如果函数需要接收用户传递的数据,那么定义时就要带上参数,它的语法格式如下:

dataType  functionName( dataType1 param1, dataType2 param2 ... ){  
    //body  
}

dataType1 param1, dataType2 param2 ...是参数列表。函数可以只有一个参数,也可以有多个,多个参数之间由逗号,分隔。参数本质上也是变量,定义时要指明类型和名称。与无参函数的定义相比,有参函数的定义仅仅是多了一个参数列表。

  • 数据通过参数传递到函数内部进行处理,处理完成以后再通过返回值告知函数外部。

形参 & 实参

函数定义时给出的参数称为形式参数,简称形参; 函数调用时给出的参数(也就是传递的数据)称为实际参数,简称实参。 函数调用时,将实参的值传递给形参,相当于一次赋值操作。

int sum(int m, int n){
    int i, sum=0;
    for(i=m; i<=n; i++){
        sum+=i;
    }
    return sum;
}
int main(){
	int ...
	int result = sum(1,100); //调用函数
	int result2 = sum(begin, end);  //传递变量
}

函数不能嵌套定义

ATTENTION C语言不允许函数嵌套定义

也就是说不能在一个函数中定义另外一个函数,必须在所有函数之外定义另外一个函数。main() 也是一个函数定义,也不能在 main() 函数内部定义新函数。

形参和实参的区别

C语言函数的参数会出现在两个地方,分别是函数定义处和函数调用处,这两个地方的参数是有区别的。

形参(形式参数)

在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参

实参(实际参数)

函数被调用时给出的参数包含了实实在在的数据,会被函数内部的代码使用,所以称为实际参数,简称实参

形参和实参的区别和联系

  1. 形参变量只有在函数被调用时才会分配内存,调用结束后,立刻释放内存,所以形参变量只有在函数内部有效,不能在函数外部使用。

  2. 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的数据,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参,所以应该提前用赋值、输入等办法使实参获得确定值。

  3. 实参和形参在数量上、类型上、顺序上必须严格一致,否则会发生“类型不匹配”的错误。当然,如果能够进行自动类型转换,或者进行了强制类型转换,那么实参类型也可以不同于形参类型。

  4. 函数调用中发生的数据传递是单向的,只能把实参的值传递给形参,而不能把形参的值反向地传递给实参;换句话说,一旦完成数据的传递,实参和形参就再也没有瓜葛了,所以,在函数调用过程中,形参的值发生改变并不会影响实参。

  5. 形参和实参虽然可以同名,但它们之间是相互独立的,互不影响,因为实参在函数外部有效,而形参在函数内部有效。

相关笔记