《2022年C语言学习大纲__郝斌 .pdf》由会员分享,可在线阅读,更多相关《2022年C语言学习大纲__郝斌 .pdf(32页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C 语言概述:1、为什么学习C 语言1). C 的起源和发展2).C 的特点优点 : 代码量小速度快功能强大缺点 : 危险性高开发周期长可移植性不强3) .c 的应用领域主要是系统领域4) .c 的重要性2、怎样学习C 语言3、学习的目标了解程序语言及发展历史熟练掌握c 语言的语法规则掌握简单的算法理解面向过程的思想,这非常有助于将来对面向对象思想的学习能看懂程序会调试程序掌握将大问题转化为一系列小问题来求解的思想为学习 c+、数据结构、c#、 java 打下良好的基础4、常见的学习问题1、学习 java 为什么建议先学习C 语言2、没学过计算机专业的课程能够学懂C 语言3、英语和数学不好能学
2、好C 吗32 个关键词:(有系统定义,不能重做其他定义)auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef unsigned unsigned union void volatile while 5、课程规划c 语言简介第一讲、基本编程知识第二讲、数据类型第三讲、运算符和表达式第四讲、 流程控制 (所有语言都一样的)第五讲、
3、 函数 (体现出面向过程和面向对象的区别)第六讲、数组名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 32 页 - - - - - - - - - 第七讲、 指针 (c 语言的灵魂 )第八讲、变量的作用域和存储方式第九讲、扩展数据类型第十讲、专题:字符串的处理进制转换补码动态内存分配 (java、数据结构必学)综合应用:链表的使用6、举例子:一元二次方程C 语言编写的病毒举例:1、龌龊的程序:/* 龌龊的程序 ! /* # include # include # incl
4、ude int main (void) int c; int i; int j; Nihao:printf(1: 死机 n); printf(2: 机房爆炸 n); printf( 请选择: ); scanf(%d,&c); If (c =1) System(shutdown -s -t 60) else if (2 = c) printf( 你太坏了我要惩罚你 !n); for (j=0;j10;+j) System(start); else 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - -
5、 - 第 2 页,共 32 页 - - - - - - - - - printf( 你敲错了,请重新输入!n) goto nihao; return 0; 2、内存泄露 (占满内存 )程序导致死机实例# include # include int main(void) while (1) int *p = (int*)malloc(1000); return 0; C 语言编程预备知识1、cpu 内存条硬盘 显卡 主板 显示器之间的关系2、Helloworld 程序如何运行起来的3、什么是数据类型基本类型数据整数整型int 字节短整型short int 字节长整型long int 字节浮点数【
6、实数】单精度浮点数float 字节双精度浮点数double字节字符char 字节复合类型数据结构体枚举共用体(已淘汰)4、什么是变量变量的本质是内存中一段存储空间名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 32 页 - - - - - - - - - 5、cpu 内存条vc+6.0 操作系统之间的关系6、变量为什么必须初始化所谓初始化就是赋值的意思7、如何定义变量数据类型变量名= 要赋的值;等价于数据类型变量名;变量名= 要赋的值;举例子:int i = 3 ; 等价
7、于int i ; i = 3; int i, j ; 等价于int i ; int j; int i, j = 3 ; 等价于int i ; int j ; j = 3 ; int i = 3, j = 5 ; 等价于int i , j ; i = 5 ; j = 5; int i , j ; i = j = 5 ; 等价于int i , j ; i = 5; j = 5; 8、什么是进制十进制就是逢十进一二进制就是逢二进一生活中用到进制的例子:一周七天:七进制一年十二个月:十二进制一小时六十分钟:六十进制电脑中的数据: 二进制进制转化:什么叫进制进制就是逢几进一我们说的 N 进制实际就是指逢
8、N 进一我们的计算机只识别二进制人类最习惯使用的是十进制为了实际需要我们又建立了八进制和十六进制C 语言规定八进制前要加0(注意是零不是字母o) ,十六进制前要加0X 或 0 x,十进制前什么都不加!在汇编中:在数字后加字母B 表示二进制数,加字母O 表示八进制数,加字母D 表示十进制,加字母H 表示十六进制。例:1011B 为二进制数1011,也记为( 1011)2 1357O 为八进制数1357,也记为( 1357)82049D 为十进制数2049,也记为( 2049)103FB9H 为十六进制数3FB9,也记为( 3FB9)16什么叫 n 进制十进制十个基数,逢10 进一基数: 0 1
9、2 3 4 5 6 7 8 9 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 32 页 - - - - - - - - - 二进制二个基数逢二进一基数:0 1 八进制8 个基数逢 8 进一基数:0 1 2 3 4 5 6 7 十六进制16 个基数逢 16 进一基数:0 1 2 3 4 5 6 7 8 9 a b c d e f 或0 1 2 3 4 5 6 7 8 9 A B C D E F 十进制(D)二进制(B)八进制(O)十六进制(0 x)0 0 0 0 1 2
10、3 4 5 6 7 8 9 10 11 12 13 14 15 9、常量在c 语言中如何表示的整数十进制:传统的写法十六进制:前面加 0 x 或 0X,是数字0 加 x 八进制:前面加数字0 浮点数:传统写法float x = 3.2;/ 传统科学计数法float x = 3.2e3;/x 的值是 3200 float x = 123.45e-2; /x 的值是 1.2345 字符单个字符用单引号括起来A 表示字符A 常用计数制对照表名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5
11、 页,共 32 页 - - - - - - - - - AB 是错误的AB 是正确的字符串用双引号括起来A 正确,因为 A 代表了A 0 的组合10、常量以什么样的二进制代码存储在计算机中整数是以补码的形式转化为二进制代码存储在计算机中的实数是以IEEE754 标准转化为二进制代码储存在计算机中的具体可参见末尾的穿插在课堂中的零散知识笔记字符的本质实际也是与整数的存储方式相同11、代码规范化代码的可读性更高【容易让别人和自己看懂】是程序更不容易出错林锐高质量C/C+编程代码要成对的敲12、什么是字节字节就是存储数据的单位,并且是硬件所能访问的最小单位1 字节= 8 位1K = 1024 字节1
12、M = 1024 K 1G = 1024 M 买硬盘时的换算是以1000 为单位的13、不同类型的数据之间相互赋值的问题暂不考虑int i = 45; long j = 102345; i= j; printf (%d %dn, i, j); float x = 6.6; double y = 8.8; printf(%f %lfn, x, y); 14、什么是 ASCIIASCII 不是一个值,而是一种规定,ASCII 规定了不同的字符是使用哪个整数值去表示它规定了A - 65 B - 66 a - 97 b - 98 名师资料总结 - - -精品资料欢迎下载 - - - - - - - -
13、 - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 32 页 - - - - - - - - - 15、字符的存储【字符本质上与整数的存储方式相同】基本的输入和输出函数的用法printf ()- (重点讲)将变量的内容输出到显示器上四种用法1.printf ( 字符串 n) 2.printf ( 输出控制符 ,输出参数 );3.printf ( 输出字符1 输出字符2 。 。 。 。 , 输出参数 1, 输出参数 2, 。 。 。 );输出控制符和参数的个数必须一一对应4.printf( 输出控制符非输出控制符, 输出参数 );输出控制符包含如下
14、%d - int (十进制)%ld - long int %c - char %f - float %lf - double %x( 或者 %X 或者 %#X) - int 或 long int 或 short int %o - 同上%s - 字符串为什么需要输出控制符1. 01 组成的代码可以表示数据也可以表示指令2. 如果 01 组成的代码表示的是数据的话,那么同样的01 代码组合以不同的输出格式输出就会有不同的输出结果scanf () -Java 中已经没有了两种用法:用法一:scanf (输入控制符 , 输入参数 ); 功能:将从键盘输入的字符转化为输入控制符所规定格式的数据,然后存入
15、已输入参数的值为地址的变量中。用法二:scanf(非输入控制符输入控制符 , 输入参数 ); 功能:将从键盘输入的字符转化为输入控制符所规定格式的数据,然后存入以输入参数的值为地址的变量中非输入控制符必须原样输入如何使用scanf编写出高质量代码1.使用 scanf之前最好先使用printf 提示用户以什么样的方式来输入2. Scanf 中尽量不要使用非输入控制符,尤其是不要用n 3. 应该编写代码对用户的非法输入做适当的处理【非重点】while (ch=getchar() != n )continue; 运算符算术运算符+ - * /(除 ) %( 取余数 ) 除法的运算结果和运算对象的数据
16、类型有关,两个数都是int,则商就是int,若商名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 32 页 - - - - - - - - - 有小数,则截取小数部分;被除数和除数中只要有一个或两个都是浮点型数据,则商也是浮点型,不截取小数部分。如:16/5 = 3 16/5.0 = 3.20000 -13/4 = -4 -13/-3 = 4 3/5 = 0 5/3 = 1 最经典的例题就是求s = 1 + 1/2 + 1/3 + 1/4 + 1/5.+ 1/100 的值。
17、取余的运算对象必须是整数,结果是整除后的余数,其余数的符号与被除数相等。如:13%3 = 1 13%-3 = 1 -13%3 = -1 -13%23 = -13 3%5 = 3 关系运算符 = 关系 逻辑 赋值附录一些琐碎的运算符知识自增 自减三目运算符逗号表达式流程控制(学习 c语言的第一个重点)1. 什么是流程控制程序代码执行的顺序名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 32 页 - - - - - - - - - 2.流程控制的分类顺序选择定义某些代码可执行
18、,也可能不执行,有选择的执行某些代码分类if 1.if 最简单的用法格式:if (表达式)语句功能:如果表达式为真,执行语句如果表达式为假,语句不执行2.if 的范围问题( 重点)1. if (表达式 ) 语句 A;语句 B;解释: if 默认只能控制语句A 的执行或不执行if 无法控制语句B 的执行或不执行或者讲:语句 B 一定会执行2. If ( 表达式 ) 语句 A;语句 B; 此时 if 可以控制语句A 和语句 B 由此可见 : if 默认只能控制一个语句的执行或不执行,如果想控制多个语句的执行或不执行就必须把这些语句用括起来。3.if.else.的用法4.if.else if.els
19、e.的用法格式:if (表达式 1) A; else if (表达式 2) B; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 32 页 - - - - - - - - - if (表达式 3) C; else D; 5.C 语言对真假的处理非零是真零就是假真用一表示假用零表示6.if 举例 - 求分数的等级7.if 的常见问题解析1.空语句的问题if (3 2); 等价于if (3 2) ; /这是一个空语句2. if (表达式 1) A;else B; 是正确的if
20、 (表达式 1);A;else B; 是错误的3. if (表达式 1) A; else if (表达式 2) B; if (表达式 3) C; else D; 即便表达式1 和 2 都成立,也只会执行A 语句4. if (表达式 1) A; else if (表达式 2) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 32 页 - - - - - - - - - B; if (表达式 3) C; 这样些语法不会错,但逻辑上有漏洞、5. if (表达式 1) A; e
21、lse if (表达式 2) B; if (表达式 3) C; else (表达式 4)/7 行D; 这样写是不对的,正确的写法是:要么去掉7 行的(表达式4)要么在 7 行的 else后面加 if 6.if (表达式 1) A; else if (表达式 2) B; if (表达式 3) C; else (表达式 4) ;D; 这样写语法不会错,但逻辑上是错误的else (表达式 4) ;D; 等价于else (表达式 4); D;对任意三个数字进行排序:如果 ab 则 a 与 c 比较ac 则输出 a ac 则输出 b bc 则输出 c 穿插在课堂中的零散知识笔记 :如何看懂一个程序,分三
22、步:1.流程2.每个语句的功能3.试 数如何学习一些需要算法的程序【如何掌握一个程序】名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 32 页 - - - - - - - - - 1. 尝试自己去编程解决它但要意识到大部分人都是自己无法解决的,如果解决不了,这时不要气馁如果十五分钟还想不出来,此时我建议您就可以看答案了2. 如果解决不了,就看答案关键是把答案看懂,这个要花很大的精力,也是我们学习的重点看懂一个程序要分三步:流程、每个语句的功能、试数3. 看懂之后尝试自己
23、去修改程序,并且知道修改之后程序的不同输出结果的含义不建议看懂程序之后就立即自己敲程序4.照着答案去敲5. 调试错误6. 不看答案,自己独立把答案敲出来7. 如果程序实在无法彻底理解,就把它背会,无法彻底理解的程序很少很少几乎没有强制类型转换格式:(数据类型) (表达式)功能:把表达式的值强制转换为前面所执行的数据类型例子:(int) (4.5+2.2) 最终值是6 (float) (5)最终值是5.0000000 浮点数的存错所带来的问题float 和 double 都不能保证可以把所有实数都准确的,保存在计算机中例子:float i = 99.9; printf(%fn, i); 最终结果
24、在VC+6.0 中的输出的结果是:99.900002 因为浮点数无法准确存储,所以就衍生出来两个编程问题举例:有一个浮点型变量x,如何判断x的值是否是零if (|x-0.0000001| m=121 sum=0*10+121%10=1 m=m/10=12; m=12 成立sum=1*10+12%10=12 m=12/10=1 m=1 成立sum=12*10+1%10=121 m=1/10=0 m=0 不成立sum=val 4. 什么时候使用while,什么时候使用for 没法说,用多了自然而然就知道了名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - -
25、- - - - - 名师精心整理 - - - - - - - 第 15 页,共 32 页 - - - - - - - - - do.while 格式:do . while(表达式 ); do.while.并不等价于for,当然也不等价于while 主要用于人机交互一元二次方程举例break 和 continue break(很重要)break 如果用于循环是用来终止循环break 如果用于switch,则是用于终止switch break 不能直接用于if,除了 if 属于循环内部的一个子句例子:for (i=0;i 2) break; /break 虽然是 if 内的语句,但break 终止
26、的却是外部的for 循环printf ( 嘿嘿 !n); /永远不会输出 在多层循环中,break 只能终止距离它最近的那 个 循环for (i=0; i3; +i) for (j=1; j4;+j) break; /break 只能终止距离它最近的循环printf ( 同志们好 !n); 在多层 switch 嵌套中, break 只能终止距离它最近的 switch 例子:int x=1, y=0, a=0, b=0; switch (x) /第一个 switch case 1: switch (y) /第二个 switch case 0: a+; break; /终止的是第二个 switc
27、h 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 32 页 - - - - - - - - - case 1: b+; break; b = 100; break; /终止的是第一个switch case 2: a+; b+; break; printf (%d %dn, a,b); /26 行最终输出结果是:1 100 continue(用的很少)用于跳过本次循环余下的语句,转去判断是否需要下次循环for (1; 2; 3) A; B; continue;/如果执行
28、该语句,则执行完该语句后,会执行语句 3,C 和 D 都不会执行C; D; while (表达式) A; B; continue;/如果执行该语句,则执行完该语句后,会执行表达式, C 和 D 都不执行。C; D; 数组1. 为什么需要数组为了解决大量同类型数据的存储和使用问题。为了模拟现实世界2. 数组的分类一维数组怎么定义一维数组为 n 个变量连续分配存储空间名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 32 页 - - - - - - - - - 所有的变量数据
29、类型必须相同所有变量所占的字节大小必须相等例子:int a5; 一维数组名不代表数组中所有的元素,一维数组名代表数组第一个元素的地址有关一维数组的操作初始化完全初始化int a5 = 1,2,3,4,5; 不完全初始化,未被初始化的元素自动为零int a5 = 1,2,3; 不初始化,所有元素是垃圾值int a5; 清零int a5 = 0; 错误写法:int a5; a5 = 1,2,3,4,5; /错误只有在定义数组的同时才可以整体赋值,其他情况下整体赋值都是错误的int a5 = 1,2,3,4,5; a5 = 100; /error 因为没有a5这个元素 ,最大只有a4 int a5
30、= 1,2,3,4,5; int b5; 如果把 a 数组中的值全部复制给b 数组错误写法:b = a; / error 正确的写法for (i=0; i5; +i) bi = ai; 赋值排序求最大 /小值倒置查找插入删除二维数组名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 32 页 - - - - - - - - - Int a34; 总共是 12 元素看,可以当做3 行四列看待,这12 个元素的名字依次是:a00 a01 a02 a03 a10 a11 a12
31、a13 a20 a21 a22 a23 aij 表示第 i+1 行第 j+1 列的元素int amn; 该二维数组右下角位置的元素只能是am-1n-1 初始化int a34 = 1,2,3,4,5,6,7,8,9,10,11,12; int a34 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ; 操作输出二维数组的内容:int a34 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ; int i, j; /输出数组内容for (i=0; i3; +i) for (j=0; j 终止被调函数,向主调函数返回表达式的值2 如果表
32、达式为空,则只终止函数,不向主调函数返回任何值3 break 是用来终止循环和switch 的, return 是用来终止函数的例子:void f() return; /return 只用来终止函数,不向被调函数返回任何值 int f() return 10; /第一:终止函数,第二:向主调函数返回10 3. 函数返回值的类型也称为函数的类型,因为如果函数名前的返回值的类型和函数执行体中的return 表达式;中表达式的类型不同的话,则最终函数返回值的类型以函数名前的返回值类型为准例子:int f() return 10.5; / 因为函数的返回值类型是int 所以最终 f 返回的是名师资料总
33、结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 20 页,共 32 页 - - - - - - - - - 10 而不是 10.5 函数的分类有参函数和 无参函数有返回值函数和 无返回值函数库函数和 用户自定义函数值传递函数和 地址传递函数普通函数和 主函数( main 函数)一个程序必须有且只能有一个主函数主函数可以调用普通函数普通函数不能调用主函数普通函数可以相互调用主函数是程序的入口,也是程序的出口注意的问题函数调用和函数定义的顺序如果函数调用写在了函数定义的前面,则必须加函数前置声明函
34、数前置声明:1. 告诉编译器即将可能出现的若干个字母代表的是一个函数2. 告诉编译器即将可能出现的若干个字母所代表的函数的形参和返回值的具体情况3. 函数声明是一个语句,末尾必须加分号4. 对库函数的声明是通过# include 来实现形参和实参个数相同位置一一对应数据类型必须相互兼容如何在软件开发中合理的设计函数来解决实际问题一个函数的功能尽量独立,单一多学习,多模仿牛人的代码函数是 C 语言的基本单位,类是Java,C#,C+ 的基本单位常用的系统函数double sqrt (double x); 求 x 的平方根int abs (int x) 求 x 的绝对值double fabs (d
35、ouble x) 求 x 的绝对值专题:递归 (可以参见数递结构视频)变量的作用域和存储方式:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 21 页,共 32 页 - - - - - - - - - 按作用域分:全局变量在所有函数外部定义的变量叫全局变量全局变量使用范围:从定义位置开始到整个程序结束局部变量在一个函数内部定义的变量或者函数的形参都统称为局部变量void f (int i) int j = 20; I 和 j 都属于局部变量局部变量使用范围:只能在本函数内部使用注意的
36、问题:全局变量和局部变量命名冲突的问题在一个函数内部如果定义的局部变量的名字和全局变量名一样时,局部变量会屏蔽掉全局变量按变量的存储方式静态变量自动变量寄存器变量指针:指针的重要性表示一些复杂的数据结构快速传递数据,减少了内存的耗用【重点】使函数返回一个以上的值【重点】能直接访问硬件能够方便的处理字符串是理解面向对象语言中引用的基础总结:指针是 c 语言的灵魂指针的定义地址内存单元的编号从零开始的非负整数范围: 4G【 0 4G-1】指针指针就是地址,地址就是指针指针就越是内存单元的编号指针变量是存放地址的变量名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - -
37、 - - - - - - - 名师精心整理 - - - - - - - 第 22 页,共 32 页 - - - - - - - - - 指针和指针变量是两个不同的概念但是要注意:通常我们叙述时会把指针变量简称为指针,实际他们含义并不一样指针的本质就是一个操作受限的非负整数指针的分类1. 基本类型指针int * p; /p 是变量的名字,int * 表示 p 变量存放的int 类型变量的地址/int * p; 不表示定义了一个名字叫做*p 的变量/ int * p; 应该这样理解:p 是变量名, p 变量的数据类型是int * 类型/ 所谓 int * 类型 实际就是存放int 变量地址的类型i
38、nt i = 3; int j; p = &i; /* 1.p 保存了 i 的地址,因此p 指向 i 2.p 不是 i,i 也不是 p,更准确的说:修改p的值不影响i 的值 ,修改 i 的值也不会影响p 的值3.如果一个指针变量指向了某个普通变量,则* 指针变量就完全等同于普通变量例子:如果 p 是个指针变量。 并且 p 存放了普通变量i 的地址 ,则 p指向了普通变量i *p 就完全等同于i 或者说:在所有出现 *p 的地方都可以替换成i,在所有出现i 的地方都可以替换成*p *p 就是以 p 的内容为地址的变量*/ j = *p; / 等价于j = i; printf(i = %d, j
39、= %dn, i, j); 经典指针程序_互换两个数:# include void huhuan(int * p, int * q) int t;/如果要互换p 和 q 的值,则t 必须是 int *,不能是int,否则会出错/如果要互换 *p 和*q 的值,则t 必须定义成int,不能定义成int * ,否则语法会出错t = *p; /p 是 int *, *p 是 int *p = *q; *q = t; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 23 页,共 32 页 -
40、 - - - - - - - - int main (void) int a = 3; int b = 5; huhuan(&a, &b);/huhuan(*p,*q);是错误的, huhuan (a,b) ;也是错误的printf(a = %d, b = %dn, a, b); return 0; 附注:*的含义1.乘法2.定义指针变量int * p; /定义了一个名字叫p 的变量, int * 表示只能存放int 变量的地址3.指针运算符该运算符放在已经定义好的指针变量的前面如果 p 是一个已经定义好的指针变量则 *p 表示 以 p 的内容为地址的变量如何通过被调函数修改主调函数普通变量的
41、值1.实参必须为该普通变量的地址2.形参必须为指针变量3.在被调函数中通过*形参名= . 的方式就可以修改主调函数相关变量的值2. 指针和数组指针和一维数组一维数组名一维数组名是个指针常量它存放的是一维数组第一个元素的地址下标和指针如果 p 是个指针变量,则pi永远等价于*p(p+i) 确定一个一维数组需要几个参数【如果一个函数要处理一个一维数组,则需要接收该数组的哪些信名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 24 页,共 32 页 - - - - - - - - - 息】需
42、要两个参数:数组第一个元素的地址数组的长度指针变量的运算指针变量不能相加不能相乘也不能相除如果两个指针变量指向的是同一块连续空间中的不同存储单元,则这两个指针变量才可以相减。一个指针变量到底占几个字节【非重点】预备知识:sizeof(数据类型 ) 功能:返回值就是该数据类型所占的字节数例子: sizeof(int) = 4 sizeof(char) = 1 sizet(double) = 8 sizeof(变量名 ) 功能:返回值是该变量所占的字节数假设 p 指向 char 类型变量( 1 个字节)假设 q 指向 int 类型变量( 4 个字节)假设 r 指向 double 类型变量( 8 个
43、字节)p q r 本身所占的字节数是否一样?答案:p q r 本身所占字节数是一样的总结:一个指针变量,无论它指向的变量占几个字节该指针变量本身只占四个字节一个变量的地址是用该变量首字节的地址来表示指针和二维数组3. 指针和函数4. 指针和结构体5. 多级指针专题:动态内存分配 【重点难点】传统数组的缺点:1.数组长度必须事现指定,且只能是常整数,不能是变量例子:Int a 5 ; /OK Int len = 5; int a len; /error 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - -
44、- - - 第 25 页,共 32 页 - - - - - - - - - 2.传统形式定义的数组,该数组的内存程序员无法手动释放数组一旦定义,系统就为该数组分配的存储空间就会一直存在,除非数组所在的函数运行结束或者说:在一个函数运行期间,系统为该函数中数组所分配的空间会一直存在,直到该函数运行完毕时,数组的空间才会被系统释放3.数组的长度不能在函数运行的过程中动态的扩充或缩小数组的长度一旦定义,其长度就不能再更改4.A 函数定义的数组,在A 函数运行期间可以被其它函数使用,但A 函数运行完毕之后,A 函数中的数组将无法再被其他函数使用传统方式定义的数组不能跨函数使用为什么需要动态内存分配内存
45、动态数组很好的解决了传统数组的这4 个缺陷传统数组也叫静态数组动态内存分配举例_ 动态数组的构造静态内存和动态内存的比较静态内存是有系统自动分配,由系统自动释放静态内存是在栈中分配的动态内存是由程序员手动分配,手动释放动态内存是在堆中分配的跨函数使用内存的问题结构体为什么需要结构体为了表示一些复杂的事物,而普通的基本类型无法满足实际要求。什么叫结构体把一些基本类型数据组合在一起形成的一个新的复合数据类型,这个叫做结构体。如何定义结构体3 种方式,推荐使用第一种:/第一种方式struct Student int age; float score; char sex; ;名师资料总结 - - -精
46、品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 26 页,共 32 页 - - - - - - - - - /第二种方式struct Student2 int age; float score; char sex; st2;/第三种方式struct int age; float score; char sex; st3; 怎么使用结构体变量赋值和初始化定义的同时可以整体赋初值如果定义完之后,则只能单个的赋初值如何取出结构体变量中的每一个成员【重点】1. 结构体变量名.成员名2. 指针变量名成员名(第二种方式更
47、常用)指针变量名成员名在计算机内部会被转化成(* 指针变量名) .成员名的方式来执行所以说这两种方式是等价的例子:struct Student int age; float score; char sex; ; int main (void) struct Student st = 80, 66.6, F;/ 初始化定义的同时赋初值struct Student * pst = &st; /&st不能改成st pst-age = 88;/第二种方式st.age = 10; /第一种方式return 0; 1.pst 在计算机内部会被转换成(*pst).age, 没有什么为什名师资料总结 - -
48、-精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 27 页,共 32 页 - - - - - - - - - 么,这就是的含义,这也是一种硬性规定2.所以pstage 等价于( *pst).age也等价于st.age 3.我们之所以知道pstage 等价于 st.age,是因为 pstage 是被转化成了(*pst).age来执行4.pst age 的含义:pst 所指向的那个结构体变量中的age这个成员结构体变量和结构体变量指针作为函数参数传递的问题推荐使用结构体指针变量作为函数参数来传递结构体变量的运算
49、结构体变量不能相加,不能相减,也不能互相乘除但结构体变量可以相互赋值例子:struct Student int age; char sex; char name100; ;/ 分号不能省struct Student st1, st2; st1+st2 st1*st2 st1/st2 都是错误的st1 = st2 或者st2 = st1 都是正确的举例动态构造存放学生信息的结构体数组动态构造一个数组,存放学生的信息然后按分数排序输出链表:枚举什么是枚举把一个事物所有可能的取值一一列举出来怎样使用枚举枚举的优缺点代码更安全书写麻烦位运算符:& 按位于& 逻辑与也叫并且& 与& 的含义完全不同1&1
50、 = 1 1&0 = 0 0&1 = 0 0&0 = 0 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 28 页,共 32 页 - - - - - - - - - 5&7=5 21&7=5 5&1=1 5&10 = 0 | | 逻辑或| 按位或1|0 = 1 1|1 = 1 0|1 = 1 0|0 =0 按位取反i 就是把 i 变量所有的二进制位取反按位异或相同为零不同为 1 10 = 1 01 = 1 11 = 0 00 = 0 按位左移i3 表示把 i 的所有二进制位左移3 位