1 函数1.1函数的介绍1.1.1 函数的概述

函数是c语言的功能单位。实现一个功能可以封装一个函数来实现。

定义函数的时候一切以功能为目的,根据功能去定函数的参数和返回值需要传哪些数据给函数?(实参)、函数的功能代码(函数体)如何实现?函数需要返回什么类型的数据?考虑(传入参数、函数体、返回值类型)

1.1.2 函数的分类 (定义角度)

库函数((c++语言库)、自定义函数、系统调用(内核提供给用户的函数接口)

1.1.3 函数的分类 (有无参数)

无参的函数:不能将函数外部的数据传递给函数内部

有参的函数:通过参数将函数外部的数据传递到函数内部

(参数:函数外部数据到函数内部的桥梁)

1.2 函数的定义、声明、调用1.2.1 函数的定义

实现函数体,确定函数名,函数的形参、函数的返回值类型

1.2.2 函数声明

函数声明:告知编译器 该函数的函数名是啥 有几个形参 返回值类型是啥

1.2.3 函数的调用

执行函数体,一般调用格式:函数名(实参);

1.4 函数的传参1.4.1 普通变量作为函数的参数

函数内部 需要使用外部变量的值 需要将外部变量的值传递给函数内部。这时普通变量就要作为函数的形参(单向传递之值传递)

1.4.2 数组作为函数的参数

1 数值数组作为函数的参数 函数内部可以(读写)外部数据的元素。

using namespace std;
void
inputIntArray(int arr[],int n);void sortIntArray(int arr[],int n);void printIntArray( int arr[],int n);void main(){ int arr[5] = {0}; int n = sizeof(arr)/sizeof(arr[0]); //获取键盘输入 inputIntArray(arr,n); //对数组排序 sortIntArray(arr,n); //对数组遍历 printIntArray(arr,n);}void printIntArray(int arr[], int n){ int i=0; for(i=0;i<n;i++) { cout<<arr[i]<<" "; } cout<<endl;}void inputIntArray(int arr[], int n){ cout<<"请输入"<<n<<"个int型数据:"; int i = 0; for(i=0;i<n;i++) { cin>>arr[i]; } return;}void sortIntArray(int arr[],int n){ int i =0; for(i=0;i<n-1;i++) { int j=0; for(j=0;j<n-i-1;j++) { if(arr[j]>arr[j+1]) { int tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; } } }}

2 字符数组作为函数的参数

int myStrlen(char str[]);void myGetString(char str[],int n);void main(){    char str[128] = "0";    //键盘获取字符串    myGetString(str,sizeof(str));    //获取字符串的长度    cout<<"长度:"<<myStrlen(str)<<endl;}int myStrlen(char str[]){    int i=0;    while(str[i] !='\0')        i++;    return i;}void myGetString(char str[],int n){    cout<<"请输入一个字符串:";    cin.getline(str,n);}

2 预处理2.1 内存分区

进程:可执行文件从运行到结束整个动态的过程就叫进程。(占内存空间)

在32位平台每一个进程占4G空间(虚拟空间)

2.2变量的存储2.2.1 普通局部变量

定义形式:{}里面定义的普通变量叫普通局部变量

存储区域:栈区

1、普通局部变量不初始化内容不确定

2、普通局部变量同名就近原则(尽量别同名)

2.2.2 普通全局变量

定义形式:在函数外定义的普通变量

作用范围:当前源文件以及其他源文件都有效。

生命周期:整个进程。

存储区域:全局区

1、全局变量不初始化内容为0

2、全局变量和局部变量同名优先选择局部变量。

3、其他源文件使用全局变量必须对全局变量进行extern声明。

2.2.3 静态局部变量

定义形式:在{}加static定义的局部变量就叫静态局部变量

作用范围:所在的复合语句之间有效

生命周期:整个进程有效

存储区域:全局区(全局区存储特点:整个进程有效,内容不初始化为0

静态局部变量整个进程都存在(第一次定义有效)

2.2.4 静态全局变量

定义形式:在函数外加static修饰定义的变量就是静态全局变量

2.3 全局函数和静态函数

作用范围:只能在当前源文件使用

存储区域:全局区

2.3.1 全局函数(函数默认都为全局函数)

全局函数:在当前源文件以及其他源文件都可以使用,

如果其他源文件使用需要extern对全局函数进行声明

2.3.2 静态函数(加static修饰的函数)

2.4 头文件包含

头文件包含:在预处理结果将头文件的内容原封不动的包含在目的文件中

#include 建议包含系统头文件

从系统指定目录寻找head.h头文件

#include “head.h” 建议””包含自定义头文件

“”先从当前目录寻找head.h头文件 如果找不到 再到系统指定的目录下寻找

2.5 #define 宏

编译四阶段:预处理、编译、汇编、链接

使用关键字 define定义 叫宏 宏尽量大写和普通变量区分开

#define PI 3.14 (宏定义)

在预处理结果 使用3.14替换所有出现PI的位置(宏展开

2.5.1 不带参数的宏

宏的作用范围:是从定义处开始 到当前文件结束都有效

#undef可以结束宏的作用域

宏 没有作用域的限制,只在当前源文件 有效

2.5.2 带参数的宏(宏函数)

1、宏的参数不能有类型

2、 宏不能保证参数的完整性

可以使用()的形式 让带参数的宏 具备一定的完整性

3、 宏不能作为结构体、类的成员

4、案例:从外部展开

2.5.3 宏函数和普通函数的区别:

带参宏被调用多少次就会展开多少次,执行代码的时候没有函数调用的过程,不需要压栈弹栈。所以带参宏,是浪费了空间,因为被展开多次,节省时间

带参函数,代码只有一份,存在代码段,调用的时候去代码段取指令,调用的时候要,压栈弹栈。有个调用的过程。带参函数是浪费了时间,节省了空间

带参函数的形参是有类型的,带参宏的形参没有类型名

函数有作用域的限制,可以作为类的成员;宏函数没有作用域的限制,不能作为类的成员