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 宏函数和普通函数的区别:
带参宏被调用多少次就会展开多少次,执行代码的时候没有函数调用的过程,不需要压栈弹栈。所以带参宏,是浪费了空间,因为被展开多次,节省时间;
带参函数,代码只有一份,存在代码段,调用的时候去代码段取指令,调用的时候要,压栈弹栈。有个调用的过程。带参函数是浪费了时间,节省了空间;
带参函数的形参是有类型的,带参宏的形参没有类型名。
函数有作用域的限制,可以作为类的成员;宏函数没有作用域的限制,不能作为类的成员