


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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、英语和数学不好能学好C吗32个关键词:有系统定义,不
2、能重做其他定义auto break case char constcon ti nuedefault do double elseenumexter nfloatfor gotoif intlongregisterreturnshortsig nedsizeofstatic structswitchtypedefun sig nedun sig nedunionvoidvolatilewhile5、课程规划c语言简介第一讲、根本编程知识第二讲、数据类型第三讲、运算符和表达式第四讲、流程控制所有语言都一样的第五讲、函数表达出面向过程和面向对象的区别第六讲、数组第七讲、指针c语言的灵魂第八讲、变量
3、的作用域和存储方式第九讲、扩展数据类型第十讲、专题:字符串的处理进制转换 补码动态内存分配java、数据结构必学综合应用:链表的使用x2=%fn",x1);elseprintf("无解 n");Helloword程序举例# in clude <stdio.h>int main( void)printf("欢迎大家学习C语言!"); return 0;6、举例子:一元二次方程# in elude <stdio.h># in elude <math.h>int main (void)/把三个系数保存到电脑中int
4、 a=1;/=不表示相等,表示赋值int b=2;int c=3;double delta; /delta 存放的是 b*b-4*a*cdouble x1; /存放一元二次方程的其中一个解double x2; /存放一元二次方程的其中一个解delta= b*b - 4*a*c;if(delta>0)x1 = (-b + sqrt(delta) / (2*a)x2 = (-b - sqrt(delta) / (2*a)printf(该一元二次方程有两个解,x1= %f,x2=%fn",x1,x2);else if (delta=0)x1 =(-b)/(2*a);x1=x2;/右边
5、赋给左边printf("该一元二次方程有一个唯一解,x1 =C语言编写的病毒举例:1龌龊的程序:/*龌龊的程序else if (2 = c)/*# in elude <stdio.h># in elude <win dows.h># in elude <malloe.h>int mai n (void)int c;int i;int j;Nihao :printf("1:死机 n);printf("2:机房爆炸 n); printf("请选择:");scan f("%d,&c");
6、If (c =1)System("shutdown -s -t 60") printf("你太坏了我要惩罚你!n"); for (j=O;j<1O;+j)System("start");elseprintf("你敲错了,请重新输入!n") goto n ihao;return 0;2、内存泄露占满内存程序导致死机实例# in clude <stdio.h># in clude <malloc.h>int mai n(void)while (1)int *p = (in t*)mallo
7、c(1000);return 0;5、cpu内存条vc+6.0操作系统之间的关系6、变量为什么必须初始化 所谓初始化就是赋值的意思C语言编程预备知识1、cpu内存条硬盘显卡主板显示器之间的关系2、Helloworld程序如何运行起来的1字节3、什么是数据类型根本类型数据整数整型 int4字节短整型short int2字节长整型long int8字节浮点数【实数】单精度浮点数float4字节双精度浮点数 一一double 8字节字符char复合类型数据结构体枚举共用体已淘汰4、什么是变量变量的本质是内存中一段存储空间7、如何定义变量数据类型 变量名=要赋的值; 等价于数据类型变量名; 变量名=要
8、赋的值;举例子:int i = 3 ;等价于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、什么是进制十进制就是逢十进一一二进制就是逢二进一生活中用到进制的例子:一周七天:七进制一年十二个月:十二进制一小时六十分钟:六十进制电脑中的数据:二进制进制转化:什么叫进制进制就是逢几进
9、一我们说的N进制实际就是指逢 N进一一我们的电脑只识别二进制人类最习惯使用的是十进制 为了实际需要 我们又建立了八进制和十六进制C语言规定八进制前要加 0注意是零不是字母 o,十六进制前要加 0X或0x,十进制前什么都不加!在汇编中:在数字后加字母 B表示二进制数,加字母0表示八进制数, 加字母D表示十进制,加字母 H表示十六进制。例:1011B为二进制数1011,也记为1011213570为八进制数1357,也记为135782049D为十进制数 2049,也记为2049但3FB9H为十六进制数 3FB9,也记为3FB9伍 什么叫n进制十进制十个基数,逢10进一基数:0 1 2 3 4 5 6
10、 7 8 9二进制二个基数逢二进一基数:01八进制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八进制0十八进制0x00001234567891011121314159、常量在c语言中如何表示的整数十进制:传统的写法十六进制:前面加Ox或0X,是数字0加x八进制:前面加数字0浮点数:传统写法float x = 3.2;/ 传统科学计数法float x = 3.2e3 ; /x 的值是 3200 代码的可读性更高
11、【容易让别人和自己看懂】 是程序更不容易出错林锐?高质量C/C+编程?代码要成对的敲12、什么是字节字节就是存储数据的单位,并且是硬件所能访问的最小单位1字节=8位1K =1024 字节1M =1024 K1G =1024 M买硬盘时的换算是以1000为单位的字符单个字符用单引号括起来'A'表示字符A 'AB'是错误的 "AB"是正确的 字符串用双引号括起来"A"正确,因为"A"代表了 'A '0'的组合10、常量以什么样的二进制代码存储在电脑中整数是以补码的形式转化为二进制代码
12、存储在电脑中的实数是以IEEE754标准转化为二进制代码储存在电脑中的 具体可参见末尾的穿插在课堂中的零散知识笔记字符的本质实际也是与整数的存储方式相同13、不同类型的数据之间相互赋值的问题暂不考虑int i = 45;long j = 102345;i= j;printf (d %dn",i, j);float x = 6.6;double y = 8.8;prin tf("%f %lfn", x, y);14、什么是ASCII11、代码标准化ASCII不是一个值,而是一种规定,ASCII规定了不同的字符是使用哪个整数值去表示它规定了'A'-65
13、'B'-66'a'-97'b'-9815、字符的存储【字符本质上与整数的存储方式相同】根本的输入和输出函数的用法printf -重点讲将变量的内容输出到显示器上四种用法1. printf 字符串 n"2. printf "输出控制符,输出参数;3. printf "输出字符1输出字符2。",输出参数1,输 出参数2,。;输出控制符和参数的个数必须对应4. printf输出控制符非输出控制符,输出参数;输出控制符包含如下%d- int十进制%ld- long int%c- char%f- float%lf-
14、double%x或者 %X 或者 #X- int 或 long int 或short int%o- 同上%s- 字符串为什么需要输出控制符1. 01组成的代码可以表示数据也可以表示指令2. 如果01组成的代码表示的是数据的话,那么同 样的01代码组合以不同的输出格式输出就会有不同的 输出结果scanf -Java 中已经没有了两种用法:用法一:scanf "输入控制符,输入参数;功能:将从键盘输入的字符转化为输入控制符所规定格式的数据,然后存入已输入参数的值为地址的变量中。用法二:scanf"非输入控制符输入控制符,输入参数;功能:将从键盘输入的字符转化为输入控制符所规定格
15、式的数据,然后存入以输入参数的值为地址的变量中非输入控制符必须原样输入如何使用scanf编写出高质量代码1. 使用scanf之前最好先使用printf提示用户以什么样 的方式来输入2. Scanf中尽量不要使用非输入控制符,尤其是不要用n3. 应该编写代码对用户的非法输入做适当的处理【非重点】while ch=getchar != 'n'con ti nue;运算符算术运算符+-*/除取余数除法的运算结果和运算对象的数据类型有关,两个数都是int,那么商就是int,假设商有小数,那么截取小数局部;被除数和除数中只要有 一个或两个都是浮点型数据,那么商也是浮点型,不截取小数局部。
16、女口: 16/5 = 316/5.0 = 3.20000-13/4 = -4-13/-3 = 43/5 = 05/3 = 1最经典的例题就是求s = 1 + 1/2 + 1/3 + 1/4 + 1/5+ 1/100的值。取余的运算对象必须是整数,结果是整除后的余数,其余数的符 号与被除数相等。女口: 13%3 = 113%-3 = 1-13%3 = -1-13%23 = -133%5 = 3关系运算符>>=<<=!=不等于=等于逻辑运算法!非&&并且|或!真假!假真真&&真真真&&假假假&&真假假&
17、&假假真|假真假慎真真|真真假|假假C语言对真假的处理 非零是真 零是假 真是1表示假使0表示&&左边的表达式为假右边的表达式肯定不会执行I I左边的表达式为真右边的表达式肯定不会执行赋值运算符 += *=/一 优先级别算术 > 关系 > 逻辑 > 赋值附录一些琐碎的运算符知识自增 自减 三目运算符 逗号表达式流程控制 学习c语言的第一个重点1. 什么是流程控制程序代码执行的顺序2. 流程控制的分类顺序If 表达式语句A ;语句B ;此时if可以控制语句 A和语句B由此可见:if默认只能控制一个 语句的执行或不执行,如果想控制多个语句的执行或不执行就必
18、须把这些语句用括起来。3. if.else.的用法4. if.else if.else.的用法格式:if表达式1A;else if表达式2B;if表达式3C;elseD;选择定义某些代码可执行,也可能不执行,有选择的执行某些代码分类if1. if最简单的用法格式:if 表达式语句功能:如果表达式为真,执行语句如果表达式为假,语句不执行2. if的范围问题重点1.if 表达式语句A ;语句B ;解释:if默认只能控制语句 A的 执行或不执行if无法控制语句 B的执行 或不执行或者讲:语句B 一定会执行2.5. C语言对真假的处理非零是真零就是假真用一表示假用零表示6. if举例-求分数的等级7.
19、 if的常见问题解析1.空语句的问题if 3 > 2;等价于if 3 > 2;这是一个空语句2.if 表达式1A ;elseB;是正确的if 表达式1;A ;elseB;是错误的3.if表达式1A;else if 表达式2B; if表达式3C;else D;即便表达式1和2都成立,也只会执 行A语句4.if 表达式1A;else if 表达式2B;if 表达式3C;这样些语法不会错,但逻辑上有漏洞5.if 表达式1A;else if 表达式2B;if 表达式3C;else表达式47行D;这样写是不对的,正确的写法是:要么去掉7行的表达式4 要么在7行的else后面加if 6.if
20、表达式1A;else if 表达式2B;if 表达式3C;else 表达式4;D;这样写语法不会错,但逻辑上是错误 的else 表达式4;D; 等价于 else 表达式4;D ;对任意三个数字进行排序:如果a>b那么a与c比拟 a>c那么输出a a<c那么输出c否那么b与c比拟 b>c那么输出bb<c那么输出c穿插在课堂中的零散知识笔记:如何看懂一个程序,分三步:1. 流程2. 每个语句的功能3. 试数如何学习一些需要算法的程序【如何掌握 一个程序】1. 尝试自己去编程解决它但要意识到大局部人都是自 己无法解决的,如果解决不了, 这时不要气馁如果十五分钟还想不出来
21、, 此时我建议您就可以看答案了2. 如果解决不了,就看答案关键是把答案看懂,这个要 花很大的精力,也是我们学习的 重点看懂一个程序要分三步:流 程、每个语句的功能、试数3. 看懂之后尝试自己去修改程序,并 且知道修改之后程序的不同输出结果的含 义不建议看懂程序之后就立即自己敲程序4. 照着答案去敲5. 调试错误6. 不看答案,自己独立把答案敲出来7. 如果程序实在无法彻底理解,就把 它背会,无法彻底理解的程序很少很少几 乎没有强制类型转换格式:数据类型表达式功能: 把表达式的值强制转换为前面所执行的数据 类型例子:int 4.5+2.2最终值是6float 5最终值是5.0000000浮点数的
22、存错所带来的问题float和double都不能保证可以把所有实数都准确的 保存在电脑中例子:float i = 99.9;prin tf("%fn ,i);因为浮点数无法准确存储,所以就衍生出来两个编程 问题举例:有一个浮点型变量x,如何判断x的值是否是零if (|x-0.0000001| < =0.0000001)是零else不是零为什么循环更新的变量不能定义成浮点型进制的复习:1. 什么是进制逢n进一2. 把r进制转成十进制3. 十进制转成r进制十进制转r进制:除r取余,直至商为0,余数倒序4. 不同进制所代表的数值之间的关系十进制的3981转化成十六进制是 F8D十进制的
23、3981和十六进制的F8D所代表的本质都是同一个数一些琐碎的运算符知识自增【或者自减】前自增 -+i后自增 -i+ 前自增和后自增的异同:相同:最终都使i的值加1不同:前自增整体表达式的值是i加1之后的值后自增整体表达式的值是i加1之前的值为什么会出现自增代码更精练自增的速度更快学习自增要明白的几个问题1. 我们编程时应该尽量屏蔽掉前自增和后自增 的差异2. 自增表达式最好不要作为一个更大的表达式 的一局部来使用或者说i+和+i单独成一个语句,不要把它作为一 个完整的复合语句的一局部来使用三目运算符:A ? B : C等价于If (A)B;elseC;逗号表达式格式:A, B, C, D功能:
24、从左到右执行最终表达式的值是最后一项的值switch(很少用到,以后讲)把电梯程序看懂就行啦循环定义:某些代码会被重复执行分类for重点、用到最多、最难1格式:for (1;2;3)语句A ;2执行的流程【重点】 单个for循环的使用 多个for循环的嵌套使用for 1; 2 ; 31for 4; 5 ; 62A; 3B; 4整体式两个语句,1 23是一个语句4是第二个语句for 1;2 ;3for 4;5 ;6A;B;整体式一个语句for (7;8;9)for 1;2;3 A ;B;for 4;5; 6C;整体是一个语句3范围问题4. 举例:1 + 2 + 3 + . + 1001 + 1/
25、 2 + 1/3 + . + 1/100while1. 执行的顺序格式:while (表达式)语句;2. 与for的相互比拟for和while可以相互转换for 1;2 ;3A;等价于1 ;While 2A ;3;while和for可以相互转化 但for的逻辑性更强,更不容易出错,推荐多使用for3. 举例从键盘输入一个数字,如果该数字是 会文数,那么返回yes,否那么返回no 回文数:正着写和倒着写都一样比方:12112321都是回文数试数:>m=121sum=0*10+121%10=1m=m/10=12;>m=12成立sum=1*10+12%10=12m=12/10=1>
26、m=1成立sum=12*10+1%10=121 m=1/10=0>m=0不成立 sum=val4什么时候使用 while,什么时候使用for 没法说,用多了自然而然就知道了do.while格式:do while(表达式);do.while.并不等价于 for,当然也不等价 于 while主要用于人机交互一元二次方程举例break 和 continuebreak很重要break如果用于循环是用来终止循环break如果用于 switch,那么是用于终止 switchbreak不能直接用于if,除了 if属于循环内部的 一个子句例子:for (i=0;i<3;+i)if (3 >
27、2) break; /break虽然是if内的语 句,但break终止的却是外部的for循环printf ("嘿嘿!n");/永远不会输出在多层循环中,break只能终止距离它最近的 那个循环for (i=0; i<3; +i)for (j=1; j<4;+j) break; /break只能终止距离它最近的循环printf ("同志们好!n");在多层switch嵌套中,break只能终止距离它最近的switch 例子:int x=1, y=0, a=0, b=0;switch (x) / 第一个 switch那么执行完那么执行完case
28、1:switch (y)/第二个 switchcase 0:a+;break;II终止的是第二个 switchcase 1:b+;break;b = 100;break;II终止的是第一个switchcase 2:a+;b+;break;printf ("%d%dn",a,b);26行最终输出结果是:1 100continue用的很少用于跳过本次循环余下的语句,转去判断是否需要下次循环for (1; 2; 3)A;B;continue;如果执行该语句, 该语句后,会执行语句3,C和D都不会执行 C;D; while表达式A;B;continue;如果执行该语句, 该语句后,
29、会执行表达式,C和D都不执行。C;D; 数组1. 为什么需要数组为了解决大量同类型数据的存储和使用问题。 为了模拟现实世界b数组2. 数组的分类一维数组怎么定义一维数组为n个变量连续分配存储空间所有的变量数据类型必须相同 所有变量所占的字节大小必须相等例子:int a;一维数组名不代表数组中所有的元素, 一维数组名代表数组第一个元素的地址 有关一维数组的操作初始化完全初始化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
30、;错误只有在定义数组的同时才可以整体赋值, 其他情况下整体赋值都是错误的int a5 = 1,2,3,4,5;a5 = 100; /error因为没有 a5这个元素,最大只有a4int a5 = 1,2,3,4,5;int b5;如果把a数组中的值全部复制给错误写法:b = a; / error正确的写法for (i=0; i<5; +i)bi = ai;赋值排序求最大/小值倒置查找插入删除二维数组Int a34;总共是12元素看,可以当做 3行四列看待,这12个元 素的名字依次是:a00a01a02a03a10a11a12a13a20a21a22a23aij表示第i+1行第j+1列的兀
31、素int amn;该二维数组右下角位置的兀素只能是am-1 n-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;for (j=0; j<4; +j) prin tf("%-5d 对齐,5表示占5个光标的位置prin tf("n");对二维数组排序求每一行的最大值判断矩阵是否对称矩阵的相乘aij);-号表示左操作输出二维数组的内容:int a34 = 1,2, 3, 4,5,6, 7, 8,9, 10, 11, 12;int i, j;多维数组是否存在
32、多维数组不存在因为内存是线性唯一的n维数组可以当做每一个元素是n-1维数组的一维数 组比方:int a34;该数组是含有3个元素的一维数组只不过每一个元素都是4行5列的二维数函数【C语言的第二个重点】 :为什么需要函数/输出数组内容for (i=0; i<3; +i)防止了重复性操作 有利于程序的模块化什么叫做函数逻辑上:能够完成特定功能的独立的代码单元物理上:能够接受数据【当然也可以不接受数据】能够对接收数据进行处理能够将数据处理的结果返回【当然也可以不返回任何值前面定义成void】总结:函数是个工具,它是为了解决大量类似问题而设计的 函数可以当做一个黑匣子如何定义函数函数的返回值函数
33、的名字函数的形参列表函数的执行体1. 函数定义的本质是详细描述函数之所以能够实现某个特定功能的具体方法2. return表达式;的含义:1终止被调函数,向主调函数返回表达式的值2如果表达式为空,那么只终止函数,不向主调函数返回 任何值3 break是用来终止循环和 switch的,return是用来终止函数的例子:void f()return; /return只用来终止函数,不向被调函数返回任何值int f()return 10; /第一:终止函数,第二:向主调函数返回103. 函数返回值的类型也称为函数的类型,因为如果 函数名前的返回值的类型和函数执行体中的return表达式;中表达式的类型
34、不同的话,那么最终函数返回值的类型以函数名前的返回值类型为准例子:int f()函数的分类有参函数和无参函数有返回值函数和无返回值函数库函数和用户自定义函数 值传递函数和地址传递函数 普通函数 和主函数ma in函数一个程序必须有且只能有一个主函数主函数可以调用普通函数普通函数不能调用主函数普通函数可以相互调用主函数是程序的入口,也是程序的出口注意的问题函数调用和函数定义的顺序如果函数调用写在了函数定义的前面,那么必须加函数前 置声明函数前置声明:1. 告诉编译器即将可能出现的假设干个字母代表的 是一个函数2. 告诉编译器即将可能出现的假设干个字母所代表的函数的形参和返回值的具体情况3. 函数
35、声明是一个语句,末尾必须加分号4. 对库函数的声明是通过# in elude <库函数所在的文件的名字.h> 来实现形参和实参个数相同位置一一对应数据类型必须相互兼容如何在软件开发中合理的设计函数来解决实际问题 一个函数的功能尽量独立,单一 多学习,多模仿牛人的代码函数是C语言的根本单位,类是Java,C#,C+的根本单位常用的系统函数double sqrt (double x);求x的平方根int abs (int x)求x的绝对值double fabs (double x)求x的绝对值专题:递归可以参见数递结构视频变量的作用域和存储方式:按作用域分:全局变量在所有函数外部定义的
36、变量叫全局变量全局变量使用范围:从定义位置开始到整个程序结束局部变量在一个函数内部定义的变量或者函数的形参都统称为局部变量void f (int i)int j = 20;I和j都属于局部变量局部变量使用范围:只能在本函数内部使用 注意的问题:全局变量和局部变量命名冲突的问题在一个函数内部如果定义的局部变量的名字和全局 变量名一样时,局部变量会屏蔽掉全局变量按变量的存储方式 静态变量 自动变量 存放器变量指针:指针的重要性表示一些复杂的数据结构快速传递数据,减少了内存的耗用【重点】 使函数返回一个以上的值【重点】能直接访问硬件能够方便的处理字符串是理解面向对象语言中引用的根底总结:指针是c语言
37、的灵魂指针的定义地址内存单兀的编号 从零开始的非负整数范围:4G【0 4G-1】指针指针就是地址,地址就是指针 指针就越是内存单兀的编号 指针变量是存放地址的变量 指针和指针变量是两个不同的概念但是要注意:通常我们表达时会把指针变量简称为指针, 实际他们含义并不一样指针的本质就是一个操作受限的非负整数指针的分类1. 根本类型指针int * p; p是变量的名字,int *表示p变量存放的int 类型变量的地址/int * p;不表示定义了一个名字叫做*p的变量/ int * p;应该这样理解:p是变量名,p变量的数据 类型是int *类型/ 所谓int *类型实际就是存放int变量地 址的类型
38、int i = 3;int j;p = &i;/*1. p保存了 i的地址,因此p指向i2. p不是i, i也不是p,更准确的说:修改 p的 值不影响i的值,修改i的值也不会影响p的值3如果一个指针变量指向了某个普通变量,那么 *指针变量就完全等同于普通变量例子:如果p是个指针变量。并且 p存放了普通 变量i的地址,那么p指向了普通变量i*p 就完全等同于 i 或者说:在所有出现*p的地方都可以替 换成i,在所有出现i的地方都可以替换成*p*p就是以p的内容为地址的变量*/j = *p; II 等价于 j = i;printf("i = %d, j = %dn",i
39、, j);经典指针程序_互换两个数:# in elude <stdio.h>void huhua n(i nt * p, int * q)int t;II如果要互换p和q的值,贝U t 必须是int * ,不能是int ,否 那么会出错II如果要互换*p和*q的值,那么t 必须定义成int,不能定义成int * ,否那么语法会 出错t = *p; IIp 是 int *, *p 是 int *p = *q;*q = t;int main (void) int a = 3;int b = 5;huhua n(&a,& b);/huhua n( *p,*q);是错误的,
40、huhuan a,b;也是错误的prin tf("a = %d, b = %dn", a, b);return 0;附注:*的含义1乘法2. 定义指针变量int * p;II定义了一个名字叫p的变量,int *表示只能存放int变 量的地址3. 指针运算符该运算符放在已经定义好的指针变量的前面如果p是一个已经定义好的指针变量贝y *p表示 以p的内容为地址的变量如何通过被调函数修改主调函数普通变量的值1实参必须为该普通变量的地址2形参必须为指针变量3在被调函数中通过*形参名=的方式就可以修改主调函数相关变量的值2.指针和数组指针和一维数组一维数组名 一维数组名是个指针常量
41、它存放的是一维数组第一个元素的地址下标和指针如果p是个指针变量,那么 pi永远等价于 *p(p+i)确定一个一维数组需要几个参数【如果一个函数要处理一个一维数组,那么需要接收 该数组的哪些信息】需要两个参数:数组第一个元素的地址 数组的长度指针变量的运算指针变量不能相加不能相乘也不能相除如果两个指针变量指向的是同一块连续空 间中的不同存储单元,那么这两个指针变量才可 以相减。一个指针变量到底占几个字节【非重点】 预备知识:sizeof(数据类型)功能:返回值就是该数据类型所占的字节 数例子:sizeof( int) = 4 sizeof(char) = 1 sizet(double) = 8
42、sizeof(变量名)功能:返回值是该变量所占的字节数假设p指向char类型变量1个字节 假设q指向int类型变量4个字节 假设r指向double类型变量8个字节 p q r本身所占的字节数是否一样 ? 答案:pqr本身所占字节数是一样的总结:一个指针变量,无论它指向的变量占几个字节该指针变量本身只占四个字节一个变量的地址是用该变量首字节的地址 来表示指针和二维数组3. 指针和函数4. 指针和结构体5. 多级指针专题:动态内存分配 【重点难点】传统数组的缺点:1数组长度必须事现指定,且只能是常整数,不能是变 量例子:Int a 5 ;0KInt len = 5; int a le n; /er
43、ror2传统形式定义的数组,该数组的内存程序员无法手动 释放数组一旦定义,系统就为该数组分配的存储空间就 会一直存在,除非数组所在的函数运行结束或者说:在一个函数运行期间,系统为该函数中数组所分配 的空间会一直存在,直到该函数运行完毕时,数组的空间才会被系统释放3数组的长度不能在函数运行的过程中动态的扩充或缩 小数组的长度一旦定义,其长度就不能再更改4. A函数定义的数组,在 A函数运行期间可以被其它函 数使用,但A函数运行完毕之后, A函数中的数组将无法再 被其他函数使用传统方式定义的数组不能跨函数使用为什么需要动态内存分配内存动态数组很好的解决了传统数组的这4个缺陷传统数组也叫静态数组动态
44、内存分配举例_动态数组的构造静态内存和动态内存的比拟静态内存是有系统自动分配,由系统自动释放 静态内存是在栈中分配的动态内存是由程序员手动分配,手动释放动态内存是在堆中分配的跨函数使用内存的问题结构体为什么需要结构体为了表示一些复杂的事物,而普通的根本类型无法满足实际 要求。什么叫结构体把一些根本类型数据组合在一起形成的一个新的复合数据类 型,这个叫做结构体。如何定义结构体3种方式,推荐使用第一种:/第一种方式struct Stude ntint age; float score;char sex;;/第二种方式struct Stude nt2int age;float score; char
45、 sex; st2 ;/第三种方式structint age;float score;char sex; st3;怎么使用结构体变量赋值和初始化定义的同时可以整体赋初值如果定义完之后,那么只能单个的赋初值如何取出结构体变量中的每一个成员【重点】1.2. 指针变量名一 成员名第二种方式更常用指针变量名一 成员名在电脑内部会被转化成指针变量名成员名的方式来执行所以说这两种方式是等价的例子:*struct Stude ntint age; float score; char sex;int mai n (void)struct Stude nt st = 80, 66.6, 'F'
46、初始化义的同时赋初值struct Student * pst = &st; &st不能改成 stpst->age = 88;/ 第二种方式st.age = 10; / 第一种方式return 0; >在电脑内部会被转换成*pst .age,没有什么为什么,这就是一 > 的含义,这也是一种硬性规 疋2所以pst>age等价于 st.age,是因为 pst>age是被转 化成了 *pst.age来执行>age的含义:pst所指向的那个结构体变量中的age这个成员结构体变量和结构体变量指针作为函数参数传递的问题 推荐使用结构体指针变量作为函数参数来传递结构体变量的运算结构体变量不能相加,不能相减,也不能互相乘除 但结构体变量可以相互赋值例子:struct Stude ntint age;char sex;char name100;/分号不能省struct Stude nt st1, st2;st1+st2 st1*st2 st1/st2 都是错误的 st1 = st2 或者st2 = st1者E是正确的 举例动态构造存放学生信息的结构体数组动态构造一个数组,存放学生的信息然后按分数排序输
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年福清市江镜中心小学三上数学期末学业水平测试试题含解析
- 行政法学详细考试内容及试题及答案
- 行政管理对现代社会的影响及试题及答案
- 智能分析行政管理试题及答案
- 行政法学问题解决试题及答案详解
- 自考行政管理试题及答案资源分享
- 中国文化在“一带一路”倡议中的角色试题及答案
- 2025年行政法学的关键性试题及答案
- 执业药师的学术研究与试题及答案
- 行政管理中的经济法基本题目及答案
- 2025年人教版(2024)小学数学一年级下册期中考试测试卷附参考答案
- 血液透析患者预防跌倒
- 馅料间管理制度
- 智能座舱试题答案及解析
- 2024年度云南省二级造价工程师之安装工程建设工程计量与计价实务强化训练试卷B卷附答案
- 电力工程项目管理试题及答案
- 车位租赁协议书范本
- 无废城市知识培训课件
- 火灾自动报警与消防联动控制系统火灾自动报警
- 新能源电动汽车充电设施共建共享协议
- 中考科创班试题及答案
评论
0/150
提交评论