注意c不进行下标越界检查

上传人:沈*** 文档编号:84825411 上传时间:2022-05-04 格式:DOC 页数:10 大小:98.50KB
返回 下载 相关 举报
注意c不进行下标越界检查_第1页
第1页 / 共10页
注意c不进行下标越界检查_第2页
第2页 / 共10页
注意c不进行下标越界检查_第3页
第3页 / 共10页
点击查看更多>>
资源描述
第四章数组数组是可以通过下标访问的同类型数据元素的集合,而下标则是标识数组元素位置的无重点内容强调如下:int num3=1,3,5,0,2,4,6素的值是多少?/定义了一个3行3列的整形数组,每个数组元|double data53 =0.0/每个数组元素赋值为0,注意中间的大括号不能少符号整数。本章内容比较简单,学员一般困难不大,在此将、一维数组的定义和使用例如:char s80/定义了一个具有80个字符的一维数组,没进行初始化int d=1,3,5,7,9,11定义了一个具有6个元素的整形数组double num5=1.0,2.0,3.0定义了一个具有 5个元素的双精度数组,前三个元素依次是1.0, 2.0, 3.0,后两个为0.0long data10=0L/10个元素都初始化为0注意:C+不进行下标越界检查,即coutdata11,编译系统不会提示出错,所以编程时一定要注意,否则可能造成无法想象的后果,因为数组在内存中是连续排列的,data10是指data9的下一个位置,而下一个位置也许是其他变量的存储空间。编程练习:1、从建盘输入n个数,输出最大数2、从建盘输入n个数,找到最大数,然后将最大数与第一个数交换位置通过上述两题的编写,你会很容易理解教材 P91例题,同时对一位数组的使用会掌握的比较 好。对教材P92例题4 一定要深刻理解,你可以自己编一程序:从键盘输入一个整数,判断他是否为素数(提示:不需要用到数组,且有多种方法,分析每种方法的计算次数)、二维数组的定义和使用共20个下标变量,未进行初始化folat d45/定义了一个4行5列单精度二维数组,int a5,3=1,3,5,2,4,6 与 int a53=1,3,5,0,2,4,6的效果一样吗?在理解教材例4.5的基础上,你如何将这程序修改为:对数组每行每列求和,然后只输出每行每列的和。对一维数组和二维数组的使用要注意以下问题:1、一维数组下标的取值范围是0元素个数1,二维数组行下标的取值范围是0行数一1,列下标的取值范围是0列数一1。2、表示一维数组有 N个成员,表示二维数组有M*N个成员,M和N最好用符号常量或者常值变量表示,而不能用一般的整形变量。如:#defi ne n 10char an;const intn=10;char an;都是正确的,int n=10;char an则是错误的。3、一维数组的处理常用单重循环,二维数组的处理常用二重循环,循环变量对应 数组的下标,处理数组的典型结构是(假定a是一维数组,b是二维数组):for(l=0;l n;l+)for(l=0;lm;l+)/* 处理 al*/for(j=0;j n;j+)/* 处理 blj*/练习:1、下列数组的定义方式是否正确?1) int n;cinn;i|int a n;2) int const n=5;int a n;3)#defi ne n 5int a n;4)#defi ne n 5int a2* n;2、编写一个程序,从键盘输入10个数,求最大数、最小数和平均数、字符数组与字符串字符数组可以用于存放字符串,因而可以通过下标直接处理字符串中的任意字符, 也可以把存于字符数组中的字符串作为一个整体, 串处理函数来处理。其中strlen (求字符串长度)连接),strcmp (字符串比较),strst (求子串位置) 望学员结合教材中的例题将这几个函数一定弄清楚。通过数组名交给系统提供的标准字符 ,strcpy (字符串复制),strcat (字符串 是处理字符串最常用的5个函数,希说明:教材P109 4_10是一个很好的例子,有兴趣的同学可以亲自编一下,并上机调试 通过。第五章C+函数一、 函数声明、定义和调用的三个步骤C+中的一个函数要经过先声明、再定义和函数调用三个步骤。当函数的定义在使用 之前时,前两步往往可以合并在一起实现。建议学员在学习c+时最好养成将声明与定义分别编写的编程习惯。强调:函数的原型与定义要在函数的返回类型,函数名和参数这三条线上保持一致。 例:void Pr(int k, float f);ii/ 也可写成 void Pr(int,float);/参数类型与数量一致即可。void Pr(in t i, float f) 二、函数传递参数的使用用于C+中的函数参数可以是值、地址(指针)和引用类型量。使用引用类型量做参数是传值和传地址的一种综合变化形式。请学员一定将教材P123例题5.5深入的理解(教师也可以把它放到第六章以后在讲解,而在这里只讲解可选参数)1、函数的返回值无缺省返回类型void中没c+中对每个函数都必须给出返回值的类型声明。如果没有返回值, 则声明应用表示(说明:在 C中,一个函数可以不声明其返回值的类型,即缺省为int。但在C+有这个缺省类型)2、可以用引用类型量做函数返回值例:struct dt.;dt &fun( )/*若在fun()前加&,则可在返回时只传少数字节的地址,从而节省时空dt dt 仁.;return dt1;void mai n() dt dt2;dt2=fu n();coutdt2.;/*因中介缓冲区的介入,传值时要二次抄传整体结构内容。/*显示st2中的内容,实为子程序中st1的内容*/*/*/四、内联(inline)函数内联函数是C+特有的一种函数类型。学员一定要深入理解,我们通过下面的例题帮助 大家理解:#in cludein li ne int add(i nt, in t);void mai n()cout2+2=add(2,2);cout100+50=add(100,50);in li ne int add(i nt x,i nt y)return (x+y);当然,这是以增加程序代码空间为代要由编译器按一定准则判断是否按C+编译器,这个判决不一样,有些(如分析:编译系统会把带inline关键字的add函数全过程的二进代码全部照抄到主程序中的两 个add(.)处,并把往返传送的数据都溶合进去直接参加运行。这样就打破了主、子程序的 界线,显然会减少系统的函数调用和返回的例行开销。 价换来的。所以对大的函数且调用频繁的情况不宜使用。 指定的inline的方式处理。对不同公司和不同版本的(如for、while)报警告错。 Marco),其实这是误解。如前所说,内联函(OBJ)的调用处,而宏则是将其源码插在源程序的调用处再一起 自然效果也就不一样了。用下面的例子来说明|Turbo C+ 1.0 )还会对这类函数中的循环语句 看了上面的分析,似乎内联函数极象宏(数是把二进码插在编译结果 参加编译。此两种码的插入阶段完全不一样, 它们之间有时发生的不同效果便可以一目了然了。先定义一宏“#define sq(x) x*x,当程序中调用的是sq(3)时,编译器解释成3*3=9。但下面的两个调用结果就不一样了:sq(1+2);/ 结果显示为:1+2*1+2=5将sq的定义改为sq(x) (x)*(x);后才能避免此类错误的发生。再如:int i=2;sq(+i); / 结果显示为:3*4=12这些结果都是由于宏作为一种源码替换在编译时就被固化在主程序中的原因而引起的,而将sq定义改为:inline int sq(int x,int y)return (x*y);后,上面的奇怪结果就不会出现了。由此可见,内联函数仍是函数的一种,而不能看成宏。五、C+中函数的缺省参数C+中可以给函数定义缺省参数值。从某个实参开始的全部实参数都缺省(不赋值) 时,在形参表中等号后的”缺省值”将起实参作用。例:#includeint sub(i nt x=1,i nt y=1)return x-y; void mai n() coutsb()sub(5)sub(5,8); 结果显示分别为:0(1-1)、4(5-1)和-3(5-8)。注意 :在使用缺省参数时要注意参数声明的顺序,即只能把带有缺省值的参数依次从右向左排放,如下的声明格式就是错误的:void sub(i nt,i nt=0,i nt);而应改成:void sub(i nt,i nt, in t=0);六、函数的重载在C+中,将含有不同的参数个数和参数类型的一系列同名函数称为重载函数。此种函数族的出现就形成了用同一函数名重复、派生多种不同用途的函数的效应, 我们又称这种效应为重载。重载函数具有极高的实用价值。比如要用同一个函数名dsp来显示不同型对象,就可以定义一系列重载函数来实现。例:#in cludevoid dsp(i nt i)coutValue is i;char dsp(char c)coutCharacter isc;retur n c;void dsp(.).;调用时只要给出同一函数名dsp并赋予实参即可,C+系统自动判断出应调重载中的哪个函数。第六章指针、引用和动态空间管理注意 :重载的函数必须在参数的数量上或类型上与其他函数名有所区别。一、正确理解指针、地址和指针变量三个概念,这是本章的关键:指针是存储特定类型数据的地址,而保存内存地址的变量称为指针变量。const在*前;指二、常值指针有两种含义,书写格式一定记请:指针指向的数据为常值时 针本身为常值时 const在*后;如:con st char *s=hello表示s指向的数据是不可改变的,而s本身可以改变 char * consts=hello表示s是不可改变的,而s指向的数据可以改变三、指针表达式的综合运算记住以下两句话:一是+,-,*,&是具有相同的,几乎最高的优先级;二是=,+=,-=,*=.是具有相同的,几乎最低的优先级;(教材中P152的例子一定要理解清楚,不要死记) 四、字符指针与字符串:第四章讲了,char s=s,t,r,i,n,g可简写为char s=string,而s又是一指针,于是char *p=s,这样指针s,p指向同一字符串,于是可见写为char *p=string;这是定义字符串的又一方法,而且常使用这种方法。要使用一批字符串可使 用如下方法:char *weekday=su n ,mo n,tue,wed,thu,fri,sat五、函数调用中参数的传递(总结)注:要求学员一定搞清楚1、传值方式(简单变量方式)这种方式实参是一简单变量,对应的形式参数只是实参的一个副本,因此对形参的改变不会影响到实参,如:void swap(double n 1,double n2)double t=n1;n仁n 2; n2=t;void mai n()double a=10.1,=20.1;swap(a,b);coutae ndlb;输出结果为:10.1 20.12、指针参数方式这种方式传递的是实参的地址给形参,因此对形参的任何改变都会影响实参,如:void swap(double *n 1,double *n2)double t=* n1;* n1=* n2;* n2=t;iivoid mai n()double a=10.1,=20.1;swap(&a,&b);coutae ndlb;输出结果为:20.1 10.13、数组参数方式数组名本身就是指针,因此它跟指针参数方式类似,对形参的任何改变都会影响实参,如:void aa(int x)x0*=2;x1*=2;x2*=2;void mai n()int y3=2,4,6;aa(y);注意书写格式couty0 y1 y2;输出结果为:4 8 124、引用参数方式弓I用是一个变量的别名,因此对这别名的任何改变都会影响到对应的变量,如:void swap(double &n 1,double &n2)double t=n1;n仁n 2; n2=t;void mai n()double a=10.1,=20.1;swap(a,b);coutae ndlb;输出结果为:20.1 10.1六、关于指针函数(返回指针值的函数)请学员分析清楚下列函数,该函数的功能是去掉一字符串的前导空格和尾随空格。char * tfr(char *s)char *s1=swhile(*s10&*s1= )s1+;char *p=s1+strle n( s1)-1;while (p-s1=0&*p= )p_;*(p+1)=0:return s1;|
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!