版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第三讲指针引用运算符语句,2,本讲内容,指针及其应用 引用 C+处理字符串的方法 用typedef声明类型 循环语句 本讲作业,3.1 指针和引用,指针 指针和数组 引用,指针,具有指针类型的变量统称为指针变量。 指针变量所表示的数据值是某个变量在内存中的地址值。称这个指针指向该变量。 指针的类型是它所指向变量的类型,而不是指针本身数据值的类型,因为任何指针本身数据值的类型都是unsigned long int型。 如: int a=5; int *p= /定义一个指向整型变量空间的指针,并初始化为整型变量a的起始地址,使p指向a。,1、指针概念,2、指针的定义,格式为: *; 例如: int
2、 *pi; /一个指向整型变量的指针 float *pl; char *pc; char (*pa)3; /一个指向数组空间的指针 int *pp; /一个指向指针变量空间的指针 注:类型的不同,并不影响指针本身空间大小的不同(都是内存地址值),但却决定了指针所指向的空间的不同,也带来了对指针所指向空间的不同操作。,指针,一、赋值运算 定义一个指针后,必须先给它赋值后才能引用,否则易出错。 如: int a=1,*p1, *p2; p1= /给p2所指向的变量赋值,3、指针的运算,1,2,3,此处无,代表取值,指针,二、加一或减一运算 如: int a10,*p; p=a; /p指向数组a中的
3、a0元素 p=p+1; /这时p指向a1,三、相减运算(一定条件下) 如: int a10,*p1,*p2; p1= /所得为指针间相隔的元素个数,0 x00428D54,指针地址是无符号长整形:4 byte,指针,C+中,数组元素可以用下标表示也可用指针表示。 1、一维数组的指针表示 如: int a5; a2=3; /下标表示 ai *(a+2)=3; /指针表示 *(a+i) 其中a是数组名,C+规定数组名是一个常量指针,其值是该数组首元素的地址值。 如: int a5,*p; p=a;/与p= /错误!为什么?,指针和数组,2、二维数组的指针表示 如: int b34; b23=3;
4、/下标表示 bij *(*(b+2)+3)=3; /指针表示 *(*(b+i)+j) 其中b是二维数组名, 对于b而言,b0等是其元素,但要注意这些元素的类型并不是int型,而是相当于int 3型。 因此,我们称b0等为第0行。 其中b0行中有b00 b02三个元素,注意这些元素的类型才是int型。 则有以下表示方式: b12 *(b1+2) (*(b+1)2 *(*(b+1)+2),指针和数组,#include iostream.h void main() int a12,*p=a; for(int i=0;i12;i+) *p=i+1; /元素赋值 if(i%4=0)coutendl; c
5、out*pt; p=p+1; ,a12,p,a0,a1,a2,a9,a10,a11,*pa0,指针下跳1, *pa1,给一维数组赋值并按每4个一行方式输出,a23,a00,int a34; int *pa=a00; /指针指向数组首元素 for(int i=1;i=12;i+) *pa=i;/给元素赋值 cout*pat;/ 输出元素的值 pa=pa+1;/指针往下走一单元 /如果是4的倍数换行 if(i%4=0)coutendl; ,给二维数组赋值并按每4个一行方式输出,行i,组j,列k,a,b,c,d,0,u,v,w,x,0,s6,p,char s6=abcde; char *p=s; c
6、outpors; p=p+1; coutp;,指针和数组,例3.1 #include void main( ) static int a5=5,4,3,2,1; int i , j; i=a0+a4; /下标表示 j=*(a+2)+*(a+4); /指针表示 coutitj; int *pa=a; pa=pa+1;/pa=?*pa=? pa+; ;/pa=?*pa=? a0、a1、a2=? ,6 4,1005 4,1009 3,5 4 3,指针和数组举例,例3.2 #include void main( ) static int b 4=1,2,3,4,5,6; b02=7;b12=8; co
7、ut*bt*(b+1) )n; cout*(*b+1)t*(*(b+1)+2) n; coutb02+b12+b22; ,7,8,输出结果为:1 4 2 8 15,指针和数组举例,#include iostream.h void main() static char s1=abcde,s25=m,n,p,q,0; char *ps=s1; couts1 or s2endl; coutpsn; couts21s22s13s14endl; cout*ps*(ps+2)*(ps+4)*ps+2; ,abcde or mnpq abcde npde ace99,S1,S2,ps,指针和数组举例,int
8、 A4,A0,A1,A2,A3,1000,1004,1008,100C,int B44,B0,B1,B2,B3,指针和数组举例,用数组存放26个字母并输出,#include iostream.h void main() char s 26; for(int i=0;i26;i+) si=A+i;/ si=65+i /给数组元素赋值 coutsi ; /输出数组 ,ABCDEFGHIJKLMNOPQ,引用作为一种数据类型,通常被认为是另一种变量的别名。 其定义格式为: 则m是对a的一个引用,所有对m的操作都是对a的操作。 注意:引用必须初始化,且一旦被初始化后不能再被重新赋值。即不能改变引用目标
9、。,3.2引用,8,引用可以针对一个常量。 如: int ,3.2引用,例:引用和变量的关系。 #include #include using namespace std; int main( ) int a=10; int ,引用的简单使用,运行记录如下: 100100 (a和b的值都是100) 2020 (a和b的值都是20),1. 定义字符串变量 和其他类型变量一样,字符串变量必须先定义后使用,定义字符串变量要用类名string。如 string string1; /定义string1为字符串变量 string string2=China; /定义string2同时对其初始化,3.3 C
10、+处理字符串的方法,将C+标准库中的string头文件包含进来,即应加上 #include /注意头文件名不是string.h,2. 对字符串变量的赋值 string1=Canada; string2=string1; 在定义字符串变量时不需指定长度,长度随其中的字符串长度而改变。可对字符串变量中某一字符进行操作,如 string word=Then; /定义并初始化字符串变量word Word2=a; /修改后word的值为Than,3.3 C+处理字符串的方法,3. 字符串变量的输入输出 cin string1; /从键盘输入一个字符串给string1 cout string2; /将字符
11、串string2输出,在以字符数组存放字符串时,字符串的运算要用字符串函数,如strcat、strcmp、strcpy,而对string类对象,可以不用这些函数,而直接用简单的运算符。 (1) 字符串复制用赋值号 string1=string2; 其作用与“strcpy(string1,string2);”相同。 (2) 字符串连接用加号 string string1=C+ ; /定义string1并赋初值 string string2=Language; /定义string2并赋初值 string1=string1 + string2; /连接string1和string2 连接后strin
12、g1为C+ Language。,3.3 C+处理字符串的方法,(3) 字符串比较直接用关系运算符 可以直接用 =(等于)、(大于)、=(大于或等于)、=(小于或等于)等关系运算符来进行字符串的比较。,3.3 C+处理字符串的方法,string name5; /定义字符串数组,它包含5个字符串元素 string name5=Zhang,Li,Fun,Wang,Tan; /定义一个字符串数组并初始化,字符串数组,3.3 C+处理字符串的方法,(1) 在一个字符串数组中包含若干个(现为5个)元素,每个元素相当于一个字符串变量。 (2) 并不要求每个字符串元素具有相同的长度,即使对同一个元素而言,它的
13、长度也是可以变化的,当向某一个元素重新赋值,其长度就可能发生变化。 (3) 在字符串数组的每一个元素中存放一个字符串,而不是一个字符,这是字符串数组与字符数组的区别。如果用字符数组存放字符串,一个元素只能存放一个字符,用一个一维字符数组存放一个字符串。 (4) 每一个字符串元素中只包含字符串本身的字符而不包括0。,3.3 C+处理字符串的方法,系统为每一个字符串变量分配4个字节(因为指针就是无符号的整型),在这个存储单元中,并不是直接存放字符串本身,而是存放字符串的地址。在本例中,就是把字符串Zhang的地址存放在name0,把字符串Li 的地址存放在name1,把字符串Fun的地址存放在na
14、me2 在字符串变量中存放的是字符串的指针(字符串的地址)。,用字符串数组存放字符串及对字符串进行处理是很方便的。 在定义字符串数组时怎样给数组分配存储空间呢?,3.3 C+处理字符串的方法,例: 输入3个字符串,要求将字母按由小到大的顺序输出。 #include #include /别忘记了这行! using namespace std; int main( ) string string1,string2,string3,temp; cinstring1string2string3; if(string2string3) temp=string2;string2=string3;strin
15、g3=temp; if(string1=string2) coutstring1 string2 string3endl; else if(string1=string3) coutstring2 string1 string3endl; else coutstring2 string3 string1endl; ,字符串运用举例,例: 一个班有n个学生(姓名和学号), 当输入一个姓名后查找该班中有无此学生,如果有则输出他的姓名和学号,如没有则输出“本班无此人”,字符串运用举例,#include #include using namespace std; string name50,num50
16、; /分别存放姓名和学号 void input_data( ); /函数声明 void search(string find_name); /函数声明 int n; /n是实际的学生数 int main( ) string find_name; /find_name是要找的学生 cinn; /输入学生数 input_data( ); /调用input_data函数,输入学生数据 cinfind_name; /输入要找的学生的姓名,search(find_name); /调用search查找该学生姓名 return 0; void input_data( ) /函数首部 int i; for (
17、i=0;inameinumi; void search(string find_name) /函数首部 int i; bool flag=false; for(i=0;in;i+) if(namei=find_name) coutnamei Found! NO. is numiendl;,字符串运用举例,flag=true; break; if(flag=false) coutNo find!; ,情况如下: :5 input name and NO.1:Li 1001 input name and NO.2:Zhang 1002 input name and NO.3:Wang 1003 i
18、nput name and NO.4:Tan 1004 input name and NO.5:Fun 1005 :Wang Wang Found! NO. is 1003,字符串运用举例,可以看到,用string定义字符串变量,简化了操作,把原来复杂的问题简单化了,这是C+对C的一个发展。 归纳起来C+对字符串的处理有两种方法: 一是用字符数组的方法, 一般称为C-string方法; 二是用string类定义字符串变量,称为string方法。 显然,string方法概念清楚,使用方便,最好采用这种方法。C+保留C-string方法主要是为了与C兼容,使以前用C写的程序能用于C+环境。,3.3
19、 C+处理字符串的方法,用typedef声明一个新的类型名来代替已有的类型名。 typedef int INTEGER; /指定用标识符INTEGER代表int类型 typedef float REAL; /指定用REAL代表float类型 int i,j; float a,b; INTEGER i,j; REAL a,b;,3.4 用typedef声明类型,两行等价!,也可以声明结构体类型: typedef struct /在struct之前用typedef,表示是声明新名 int month; int day; int year; DATE; /注意DATE是新类型名,而不是结构体变量名
20、所声明的新类型名DATE代表上面指定的一个结构体类型。这样就可以用DATE定义变量: DATE birthday; / birthday为上述结构体类型 DATE *p; /p为指向此结构体类型数据的指针,3.4 用typedef声明类型, typedef int NUM100; /声明NUM为整型数组类型,包含100个元素 NUM n; /定义n为包含100个整型元素的数组 typedef char *STRING; /声明STRING为字符指针类型 STRING p,s10; /p为字符指针变量,s为指针数组(有10个元素) typedef int (*POINTER)( ) /声明POI
21、NTER为指向函数的指针类型,函数返回整型值 POINTER p1,p2; / p1,p2为POINTER类型的指针变量,3.4 用typedef声明类型,归纳起来,声明一个新的类型名的方法是: 先按定义变量的方法写出定义语句(如int i;)。 将变量名换成新类型名(如将i换成COUNT)。 在最前面加typedef(如typedef int COUNT)。 然后可以用新类型名去定义变量。,3.4 用typedef声明类型,再以声明上述的数组类型为例来说明: 先按定义数组形式书写: int n100; 将变量名n换成自己指定的类型名: int NUM100; 在前面加上typedef,得到t
22、ypedef int NUM100; 用来定义变量: NUM n;(n是包含100个整型元素的数组)。 习惯上常把用typedef声明的类型名用大写字母表示,以便与系统提供的标准类型标识符相区别。,3.4 用typedef声明类型,(1) typedef可以声明各种类型名,但不能用来定义变量。用typedef可以声明数组类型、字符串类型,使用比较方便。 (2) 用typedef只是对已经存在的类型增加一个类型名,而没有创造新的类型。 (3) 当在不同源文件中用到同一类型数据(尤其是像数组、指针、结构体、共用体等类型数据)时,常用typedef声明一些数据类型,把它们单独放在一个头文件中,然后在
23、需要用到它们的文件中用include命令把它们包含进来,以提高编程效率。 (4) 使用typedef有利于程序的通用与移植。,3.4 用typedef声明类型,运算符的优先级和结合性,1、优先级 共15种优先级。分别为: 元素/成员-单目-双目-三目-赋值-逗号 常用的双目运算符的优先级又分为: 算术-移位-关系-逻辑位-逻辑,2、结合性 大多数为从左至右,只有三类是从右至左。 分别为: 单目、三目和赋值,除最高的元素成员,最低的逗号外,其余的一二三赋值, 对双目运算:算术关系逻辑 ,移位逻辑位放中间,口诀:, ,第1行一个 第2行二个 。 第N行N个,int i,j,n; coutn; fo
24、r(int i=1;i=n;i+) for(j=1;j=i;j+) cout*;/打印若干个 coutendl; /换行 , ,for(j=1;j=n-i+1;j+),例题与解析, ,第1行:4个,接着1个,换行 第2行:3个,接着3个,换行 第3行:2个,接着5个,换行 第4行:1个,接着7个,换行 第5行:0个,接着9个,换行,每行的个数:5-i 每行的个数: 2*i-1 每次循环要做三件事: 先打印(5-i) 个 后,接着打印(2*i-1)个,再换行,for(int i=1;i=5;i+) for(j=1;j=5-i;j+) cout;/打印若干个 for(k=1;k=2*i-1;k+)
25、 cout;/打印若干个 coutendl; /换行 ,例题与解析,1,2,例题与解析,3,4,7,例题与解析,打印九九乘法口诀表,#include iostream.h #include iomanip.h/manipulate,操作 void main() int i,j; for(i=1;i=9;i+) for(j=1;j=9;j+) couti*j=setw(2)i*j ; coutendl; ,设置后面内容宽度为2,for(j=1;j=10-i;j+),for(j=1;j=i;j+),例题与解析,for(i=1;i=9;i+) for(k=1;k=9-i;k+)cout ;/7个空格
26、 for(j=1;j=i;j+) couti*(9-i+j)= setw(2)i*(9-i+j) ; Coutendl; ,例题与解析,2,例题与解析,#include iostream.h #include iomanip.h/manipulate,操作 void main() int i,j; for(i=1;i=10;i+) for(j=1;j=11-i;j+) cout ;/2个空格 for(j=1;j=i;j+) /限定为两个位置的长度 coutsetw(2)i ; coutendl; ,例题与解析,条件语句格式: if() else if() else if() else if()
27、 else,条件语句,条件语句,格式如下: switch() case: case: case: default: /可无 ,语义为: 根据对整型表达式的计算得到的值,从第一个case常量开始从上到下逐个进行匹配,若相等,则以此为入口,顺序向下执行各条语句序列。,开关语句,格式如下: switch() case:; break; case:; break; case:;break; default: /可无 ,通过加break强行跳转语句,在执行完第一个语句序列后,就强行跳出switch结构,开关语句,格式: for(e1;e2;e3),计算e2,执行,非0,0,退出 循环,计算e1,计算d3
28、,e1; while(e2) ; e3; ,for循环语句,格式: break; 该语句在程序中可用于下列两种情况: 1、在开关语句中,其功能是退出开关语句,执行其后的语句; 2、在循环体中,其功能是用来退出该重循环,break语句,#define M 10 void main() int num,sum(0); coutnum; if(num0) break; sum+=num; coutsum=sumendl; ,求10个数之和,遇负数终止,格式: continue; 功能:只用在循环体中,用来结束该次循环。 在循环体中遇到continue语句时,本次循环结束,回到循环条件判断是否执行下一
29、次循环。,continue语句,#define M 10 void main() int num,sum(0); coutnum; if(num0) continue; sum+=num; coutsum=sumendl; ,求10个中的正数之和,m是素数的条件是不能被2,3,m-1整除。 long m; coutm; /输入 for (int I=2;I= m) coutmis prime.n; else coutmisnt prime.n; /输出,判断整数m其是否为素数,快速算法:判断它能否被2到sqrt(m)之间的数整除,若不能则是素数。 long m; coutm; int sqrt
30、m=sqrt(m); for (int I=2;I=sqrtm+1) coutmis prime.n; else coutmisnt prime.n; /输出,判断素数的快速算法,分析程序运行结果。 int I(1),a(0); for (;I=5;I+) do i+; a+; while(I3); I+; couta,Iendl;,7,本讲作业1,1、编程实现两个浮点数的四则运算; 2、编程求出50至100之内的素数并输出; 3、求两个数的最大公约数和最小公倍数; 4、求一元二次方程ax2+bx+c=0的解; 5、打印如下图形:,1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 6 6 6 6 6 6 10 10 10 10 10 10 10 10 10,1、打印以下图形: A ABC ABCDE ABCDEFG ABCDEFG.S,本讲作业2,2、百钱买百鸡。公鸡每只7元,母鸡每只5元,小鸡1元3只,用100地元买100只鸡(每种鸡都要有),请问公鸡母鸡小鸡各有多少? 3、编程求水仙花数。水仙花数是指一个三位数,如果其各位数的立方和刚好等于该数本身)。如153135333 4、求1000以内的所有完数(指一个数恰好等于它的包括1在内的所有因子之和)。如6123,5、
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 水池内作业专项方案编制保证措施
- 确认收到服务器维护报告确认函4篇
- 建筑行业施工安全作业规范指南
- 静脉血栓栓塞症(VTE)相关知识知晓率调查问卷(护理人员)
- 物联网智能家居产品设计手册
- 木地板地面验收标准
- 2026年艺术设计专业技能考试题及答案
- PE给水管安装施工工艺及施工方法
- 2026学年内蒙古自治区丰镇市六年级数学期末点睛提升精准押题卷(详细参考解析)详细答案和解析
- 2025江西上饶德兴市银城和谐人力资源有限公司招聘115人笔试历年参考题库附带答案详解
- 黑龙江省哈尔滨市2025届中考物理试卷(含答案)
- 2026年中国中车集团软件岗面试常见问题及嵌入式系统考点
- 储能行业压缩空气储能电站经济性调研报告
- 长租公寓盈利模式与成本结构优化
- 2026年自贡市自流井区社区工作者招聘笔试参考试题及答案解析
- 2026年初级经济师之初级经济师工商管理从业资格考试真题及参考答案详解AB卷
- 雨课堂学堂在线学堂云审计法律研究与案例(西南政法大学)单元测试考核答案
- 2026安徽合肥市发展和改革委员会上半年招聘事业单位工作人员20人考试备考试题及答案解析
- 2026年危险化学品重点县专家指导服务自查表
- 2026年贵州综合评标专家库评标专家考试经典试题及答案
- 2025-2026学年统编版二年级下册小学道德与法治每课教学设计(附目录)
评论
0/150
提交评论