
二维数组作为函数参数形参 二维数组形式 行数的变量实参 二维数组数组名 行数的值练习:二维数组 累计求和sumOfArray()sum sum x[i][j]二维字符型数组作为函数参数二维字符型数组一维字符型数组----存放一个字符串二维字符型数组----存放多个字符串字符型二维数组做 函数参数 与 整型二维数组作为函数参数 --写法一致形参 二维数组形式 行数的变量实参 二维数组数组名 行数的值练习:实现一个函数找出最大的字符串maxOfStr练习:排序对字符串排序 ---写成函数练习:查找begin 0midend row-1binaryFind(char s[][10],int row,char str[10])总结:1.一维整型数组 做函数参数形参 --- 数组形式 数组长度实参 --- 数组名 数组长度2.一维字符型数组 做函数参数形参 --- 数组形式实参 --- 数组名注意: 一维字符型数组 主要用来存储字符串数据3.二维整型数组 做函数参数形参 --- 数组形式 行数 //本质 就是一维数组的长度实参 --- 数组名 行数4.二维字符型数组 做函数参数形参 --- 数组形式 行数 //本质 就是一维数组的长度实参 --- 数组名 行数标识符的作用域 与 可见性问题:说明:1.变量名2.函数名3.数组名作用域:发挥作用区域{} //C语言中 一个 {} 就是一个作用域局部作用域只要是在{} 范围内的 都是局部作用域局部作用域定义的变量 --- 局部变量全局作用域不在任何一个 {} 范围内的是全局作用域全局作用域定义的变量 --- 全局变量可见性:站在程序角度看程序运行到某一刻时哪些标识符可见(可用)标识符的可见性的规则:1.先定义后使用2.同一作用域中不能有同名标识符3.在不同的作用域同名标识符相互之间没有影响4.如果是不同的作用域但是作用域之间存在嵌套关系则内层的作用域的同名标识符会屏蔽外层的作用域的同名标识符。(就近原则)C语言5个区:栈堆全局区(静态区)字符串常量区代码区存储类别关键字:main(){int a 10; //局部变量 --- 定义变量 意味着开空间 ---空间开在哪里}指定关键字 来表示 数据可以放到来autoauto int a 10; //auto 就表示这个变量空间开在栈上static做局部变量时static int a 10; //static 静态的 表示将变量 空间 开在静态区静态区变量的特点:// 1.只会被初始化一次 如果定义a后期循环里a那么a会一直累计增长不会默认是最初的那个a// 2.不能用变量初始化// 全局变量也不能用变量初始化 ---全局变量和静态变量都是放在全局区(静态区)// 3.静态局部变量的值具有继承性从变量角度看空间上:局部变量全局变量时间上:生命周期局部变量 的生命周期---定义定义处开始到所在作用域结束//程序执行到定义时变量创建程序执行到 作用域结束 变量销毁全局变量静态变量 的生命周期---程序运行开始后就存在直到整个程序结束才销毁./a.out(整个程序的生命周期)生命周期改变变成全局/静态存储普通局部变量auto在进入函数时创建分配在栈区函数执行完毕退出时就会被销毁下次再调用函数时重新初始化。static 局部变量存储位置从栈区变到了静态存储区数据段/BSS段。生命周期变为贯穿整个程序运行期间从程序启动直到程序结束才销毁。初始化特性只在程序首次执行到该行时初始化一次。如果不手动赋初值系统会自动将其初始化为 0或 NULL。值保持记忆功能函数执行完毕退出后该变量的值依然保留下次再次调用该函数时变量保持的是上一次离开函数时的值。做全局变量时表示 将该变量的作用域限定为本文件别的文件中无法引用(extern int a;)static修饰全局变量 ---限定了作用域也可以修饰函数多文件编程作用和修饰全局变量作用相同保护数据作用registerregister int a 10; //register ---寄存器//告诉编译器 将变量a 存放到 寄存器中//关键字 ---- 建议性关键字知识建议寄存器可能不采纳//考点// 如果是register修饰的变量//不能做 (取地址)运算// 原因 --- 内存空间可以取地址寄存器取不了寄存器和内存是两个地方取地址操作是针对于内存而言因为计算机的存储体系:寄存器cache内存硬盘从上到下容量越来越大价格越来越便宜速度原来越慢externextern int a; //extern --- 外部的意思 --- extern相当于是扩展了变量的作用域//相当于将a的作用域扩展到本文件//修饰表示变量存储在别的文件中要使用需到别的文件中寻找。预处理命令:#include stdio.h //预处理命令C提供的预处理功能主要有以下3种1. 宏定义2. 文件包含3. 条件编译注意:1.所有的预处理命令 都 以 # 开头编译:gcc hello.c //编译实际的编译过程:预处理:将程序中的预处理命令执行完将代码处理成纯的C语言代码gcc -E hello.c -o hello.i编译:将预处理完的文件进行语法词法分析检查问题生成 一份汇编代码gcc -S hello.i -o hello.s汇编:将前面的汇编代码最终翻译成机器代码gcc -c hello.s -o hello.o链接:将用到的第三方代码 链接(拼接)成为 最终可执行程序gcc hello.o -o hello归纳预处理:gcc -E hello.c -o hello.i编译:gcc -S hello.i -o hello.s汇编:gcc -c hello.s -o hello.o链接:gcc hello.o -o hello宏定义#define 标识符字符串#define 宏名 宏值作用:用宏名代替 一串文本信息注意:1. 宏名 --本质还是一个标识符2. 宏名 建议 大写3. 宏名 --符号常量用了一个 符号(宏名) 代替 常量值4. 宏工作的本质文本原样替换 只是单纯替换。不参与任何计算但是:代码中出现在//字符串中的 宏名 不会被替换5. 用途可以用宏名 来代替一些常量符号常量好处可以做到一改全改可以提高代码可读性6.宏替换不占用运行时间练习:计算一下 圆的周长和面积从键盘输入一个半径L 2*π*rS π*r*r带参宏:#define 宏名(参数表) 宏值带参宏特点:1.带参宏 可以 给一些参数形式 特别像函数调用宏函数2.带参宏 和 函数有本质的区别a.函数的参数 是带类型的b.带参宏 参数没有类型 --就是文本c.函数什么时候可以用程序运行之后d.带参宏在预处理阶段就处理完了3.带参宏 工作过程本质上还是文本原样替换参数是一一对应的4.带参宏副作用建议能加括号都加括号可能会改变我们建议都加括号5.所有宏定义是以 换行作为结束符#undef命令来终止宏定义的作用域例如两个数相乘int mul(int a,int b){returna * b;}#define MUL(a,b) a*bMUL(12,34)12*34 单纯的就是纯替换没有任何运算#define MUL(a,b) ((a)*(b)) 所以尽量加上括号练习:实现一个宏找出两个数的最大值