1.函数的概念
函数的定义:子程序(子程序是一个大型程序的某部分代码,由一个或多个语句块组成。它负责完成某项特定任务,而且相对其他代码,具有相对的独立性。一般有输入参数和返回值,提供对过程的封装和对细节的隐藏。这些代码通常被集成为软件库)。
C语言中函数的分类:库函数,自定义函数。
2.库函数
使用库函数,必须包含#include对应的头文件。
库函数包括:
IO函数
字符串操作函数
字符操作函数
内存操作函数
时间/日期函数
数学函数
其他库函数
tolower:
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
int main()
{
char c = 'W';
printf("%c\n", tolower(c)); //大写转小写
system("pause");
return 0;
}
strcpy:
#include<stdio.h>
#include<string.h>
int main()
{
char arr[20]={0};
strcpy(arr, "hello");//将“hello”拷贝到arr中并返回arr的首地址
return 0;
}
memset:
#include<stdio.h>
#include<stdlib.h>
int main()
{
char arr[20]={0};
memset(arr, 'a', 20);//将20个a放到arr中
return 0;
}
3.自定义函数
自定义函数和库函数一样,有函数名、返回类型和函数参数。
#include<stdio.h>
int get_max(int x, int y)//得到两个数中的最大值的函数
{
return x>y?x:y;
}
int main()
{
int a = 10;
int b = 20;
int max = get_max(a,b);
return 0;
}
4.函数的参数
(1)函数的实参:真实传给函数的参数
实参可以是常量,变量,函数,表达式等。
(2)函数的形参:函数名后括号中的变量
只有在被调用的时候才被实例化(分配内存单元),当函数调用完之后形参就被销毁了。因此形参只有在函数中有效。
实参和形参使用的不是同一片空间。形参实例化后相当于实参的一份临时拷贝。
5.函数的调用
(1)传值调用
函数的形参和实参分别占有不同的内存块,对形参的修改不会影响实参。
(2)传址调用
传址调用是把函数外部创建变量的内存地址传递给函数参数的一种方式。这种传参方式可以让函数和函数外边的便利那个建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
6.函数的嵌套调用和链式访问
(1)嵌套调用
#include <stdio.h>
void new_line()
{
printf("hehe\n");
}
void three_line()
{
new_line();
new_line();
new_line();
}
int main()
{
three_line();
return 0;
}
(2)链式访问
#include<stdio.h>
#include<string.h>
int main()
{
int ret = strlen(strcat("hello", "world"));
return 0;
}
7.函数的声明和定义
(1)函数声明
告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在无关紧要。
函数的声明一般出现在函数的使用之前。要满足先声明后使用。
函数的声明一般要放在头文件中。
(2)函数定义
函数的定义是指函数的具体实现,交代函数的功能实现。
8.链接属性
函数在使用的时候kennel在不同的源文件中,每个源文件单独编译完成之后生成对应的目标文件,所有的目标文件以及那些从一个或多个函数库中引用的函数,链接在一起形成了可执行程序。
链接属性分为:
(1)外部链接属性
全局标识符具有外部链接属性。
外部链接属性就意味着一个标识符,不仅可以在当前源文件使用,使用extern的声明也可以在其他源文件使用。
(2)内部链接属性
具有外部链接属性的标识符如果前面加上static关键字修饰就会变成内部链接属性。
static修饰局部变量, 改变变量的生命周期,不改变作用域;
static修饰全局变量,改变变量的链接属性,然后影响到了变量的作用域;
static修饰函数,改变了函数的链接属性,由外部链接属性变成了内部链接属性。
(3)无链接属性
局部变量是无属性的。
//推荐书籍《C和指针》第三章:链接属性部分