指针引用运算符语句课件_第1页
指针引用运算符语句课件_第2页
指针引用运算符语句课件_第3页
指针引用运算符语句课件_第4页
指针引用运算符语句课件_第5页
已阅读5页,还剩143页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三讲

指针引用运算符语句

第三讲

指针引用运算符语句本讲内容上次作业讲解指针及其应用引用运算符循环语句本讲作业2本讲内容上次作业讲解23.1指针和引用指针指针和数组引用3.1指针和引用指针3指针

具有指针类型的变量统称为指针变量。指针变量所表示的数据值是某个变量在内存中的地址值。称这个指针指向该变量。

指针的类型是它所指向变量的类型,而不是指针本身数据值的类型,因为任何指针本身数据值的类型都是unsignedlongint型。

如:

inta=5;int*p=&a;

//定义一个指向整型变量空间的指针,并初始化为整型变量a的起始地址,使p指向a。1、指针概念5p1001a

10012003指针具有指针类型的变量统称为指针变量。1、指针42、指针的定义格式为:<类型>*<指针变量名>;例如:

int*pi;

//一个指向整型变量的指针

float*pl;

char*pc;char(*pa)[3];

//一个指向数组空间的指针

int**pp;

//一个指向指针变量空间的指针

注:类型的不同,并不影响指针本身空间大小的不同(都是内存地址值),但却决定了指针所指向的空间的不同,也带来了对指针所指向空间的不同操作。可以指向,但还未指向P2003100120一个整型空间10012、指针的定义格式为:<类型>*<指针变5一、赋值运算定义一个指针后,必须先给它赋值后才能引用,否则易出错。

如:

inta=1,*p1,*p2;p1=&a;

//赋给同类型的变量地址值p2=p1;

//赋给同类型的指针变量的值

*p1=2;//给p1所指向的变量赋值*p2=3;//给p2所指向的变量赋值

3、指针的运算P1a*P1*P2P2.123此处无**代表取值一、赋值运算3、指针的运算P1a*P1P26二、加一或减一运算如:inta[10],*p;p=a;//p指向数组a中的a[0]元素p=p+1;

//这时p指向a[1]三、相减运算(一定条件下)如:

inta[10],*p1,*p2;p1=&a[2];p2=&a[5];

//分别指向数组中的不同元素

intm=p2-p1;

//所得为指针间相隔的元素个数P20031001a[0]a100110051009100d1011a[1]a[2]a[3]a[4]P200310050x00428D54指针地址是无符号长整形:4byte二、加一或减一运算三、相减运算(一定条件下)P20031007C++中,数组元素可以用下标表示也可用指针表示。1、一维数组的指针表示如:

inta[5];

a[2]=3;

//下标表示a[i]

*(a+2)=3;

//指针表示*(a+i)其中a是数组名,C++规定数组名是一个常量指针,其值是该数组首元素的地址值。如:

inta[5],*p;p=a;//与p=&a[0]等效

p=p+1;*p=4;

//将4赋给a[1]

注意:a=a+1;

//错误!为什么?指针和数组C++中,数组元素可以用下标表示也可用指针表示。指针和数组82、二维数组的指针表示如:

intb[3][4];b[2][3]=3;//下标表示b[i][j]*(*(b+2)+3)=3;

//指针表示*(*(b+i)+j)其中b是二维数组名,对于b而言,b[0]等是其元素,但要注意这些元素的类型并不是int型,而是相当于int[3]型。因此,我们称b[0]等为第0行。其中b[0]行中有b[0][0]~b[0][2]三个元素,注意这些元素的类型才是int型。则有以下表示方式:

b[1][2]*(b[1]+2)(*(b+1))[2]*(*(b+1)+2)b[0]b[1]b[2]b[0][0]b[0][1]b[0][2]b[0][3]b[1][0]b[1][1]b[1][2]b[1][3]b[2][0]b[2][1]b[2][2]b[2][3]b2、二维数组的指针表示b[0]b[0][0]b9#include"iostream.h"voidmain(){inta[12],*p=a;for(inti=0;i<12;i++){ *p=i+1;//元素赋值if(i%4==0)cout<<endl; cout<<*p<<"\t"; p=p+1; }}123456789101112a[12]pa[0]a[1]a[2]a[9]a[10]a[11]*pa[0],指针下跳1,*pa[1]给一维数组赋值并按每4个一行方式输出#include"iostream.h"12345678910123456789101112a[2][3]a[0][0]inta[3][4];int*pa=&a[0][0];//指针指向数组首元素for(inti=1;i<=12;i++){

*pa=i;//给元素赋值cout<<*pa<<"\t";//输出元素的值pa=pa+1;//指针往下走一单元

//如果是4的倍数换行if(i%4==0)cout<<endl;}给二维数组赋值并按每4个一行方式输出123456789101112a[2][3]a[0][0]i11行i组j列kabcd\0uvwx\0abcde\0s[6]pchars[6]="abcde";char*p=s;cout<<p<<"or"<<s;p=p+1;cout<<p;行i组j列kabcd\0uvwx\0abcde\0s[6]p12[例3.1]#include<iostream.h>voidmain(){staticinta[5]={5,4,3,2,1};inti,j;i=a[0]+a[4];//下标表示j=*(a+2)+*(a+4);//指针表示cout<<i<<"\t"<<j;int*pa=a;pa=pa+1;//pa=?*pa=?pa++;;//pa=?*pa=?

a[0]、a[1]、a[2]=?}

101154321a[0]a(1001)100110051009100d1011a[1]a[2]a[3]a[4]1009641005410093543[例3.1]10115a[0]a(1001)1001a[1]13

[例3.2]

#include<iostream.h>voidmain(){staticintb[][4]={{1,2,3},{4},{5,6}};b[0][2]=7;b[1][2]=8;cout<<**b<<"\t"<<**(b+1))<<"\n";cout<<*(*b+1)<<"\t"<<*(*(b+1)+2)<<"\n";cout<<b[0][2]+b[1][2]+b[2][2];}b[0]b[1]b[2]b[0][0]b[0][1]b[0][2]b[0][3]b[1][0]b[1][1]b[1][2]b[1][3]b[2][0]b[2][1]b[2][2]b[2][3]b12304000560078输出结果为:142815[例3.2]b[0]b[0][0]b178输14#include"iostream.h"voidmain(){ staticchars1[]="abcde",s2[5]={'m','n','p','q','\0'}; char*ps=s1; cout<<s1<<"or"<<s2<<endl; cout<<ps<<'\n'; cout<<s2[1]<<s2[2]<<s1[3]<<s1[4]<<endl; cout<<*ps<<*(ps+2)<<*(ps+4)<<*ps+2;}abcdeormnpqabcdenpdeace99abcde\0mnpq\0S1S2ps#include"iostream.h"abcdeor15intA[4]A[0]A[1]A[2]A[3]100010041008100CintB[4][4]B[0]B[1]B[2]B[3][0][1][2][3]intA[4]A[0]A[1]A[2]A[3]1000116用数组存放26个字母并输出#include"iostream.h"voidmain(){ chars[26]; for(inti=0;i<26;i++){s[i]='A'+i;//s[i]=65+i //给数组元素赋值cout<<s[i]<<"";//输出数组}

}ABCDEFGHIJKLMNOPQ用数组存放26个字母并输出ABCDEFGHI17引用作为一种数据类型,通常被认为是另一种变量的别名。其定义格式为:

<类型>&<引用名>=<变量名>;如:inta=3;int&m=a;m=m+5;则m是对a的一个引用,所有对m的操作都是对a的操作。注意:引用必须初始化,且一旦被初始化后不能再被重新赋值。即不能改变引用目标。3.2引用ma3.8引用作为一种数据类型,通常被认为是另一种变量的别名。3.218引用可以针对一个常量。

如:int&d=120;这时,引用的是一个系统为保存常量120而自动建立的临时变量空间。相当于:intt=120;int&d=t;引用可以针对一个常量。193.3运算符算术运算符关系运算符逻辑运算符位操作运算符赋值运算符其他运算符运算符的优先级和结合性3.3运算符算术运算符20算术运算符单目运算符(-(负))双目运算符(+(加)、-(减)、*(乘)、/(除)、%(模,求余)优先级为:负号级别最高,其次为*/%,再就是+-。要求:操作数为数值型数据其中%要求为整型/与%的第二操作数不为0特别注意“/”,当分子分母都是整数是做整除!1、普通算术运算符算术运算符单目运算符(-(负))1、普通算术运算符212、增1和减1运算符增量操作表示加1,减量操作表示减1。如:inta=4;

a++;

//等效于a=a+1;

++a;

//等效于a=a+1;

a--;

//等效于a=a-1;

--a;

//等效于a=a-1;增量操作符有前增量与后增量之分。前增量操作++a的意义为:先修改操作数的值再将增1后的a值作为表达式的值。而后增量操作a++的意义为:先将a的值作为表达式的值确定下来,再将a增1。2、增1和减1运算符22如:inta=3;intb=++a;intc=a++;则:a:5,b:4,c:4。相应的,有--a和a--。增量和减量操作符都是单目操作符。近水楼台先得月4a值表达式值a值表达式值++aa++345444如:近水楼台先得月4a值表达式值a值表达式值++aa++3423关系运算符C++提供了6种关系运算符:〈(小于)、〉(大于)、〈=(小于等于)、〉=(大于等于)、==(等于)、!=(不等于)

关系运算符都是双目运算符。优先级:〈、〉、〈=、〉=四种比==、!=两种要高要求:两个操作数为同一类型其结果值为1(代表逻辑真)或0(代表逻辑假)。关系运算符C++提供了6种关系运算符:24逻辑运算符三种逻辑运算符:

&&(逻辑与)、||(逻辑或)、!(逻辑非)。其中逻辑非为单目运算符,逻辑与和逻辑或为双目运算符。优先级:!的优先级最高,而&&又比||要高。逻辑表达式中的操作数是作为逻辑量,但C++并不专门提供逻辑类型,只用1与0来代表逻辑结果真与假。对于参与逻辑运算的操作数,其值为0代表逻辑假,为非0时代表逻辑真。如:!(a==9)逻辑运算符三种逻辑运算符:25位操作运算符位运算是指直接对int型或char型数据的各位进行运算。C++中的位运算符有两类:1、按位逻辑运算符共有四种:(按位取反运算符)~、(按位与运算符)&(按位异或运算符)^、(按位或运算符)|如:a:01101110,则~a为10010001(按位取反)如:a:10101101,b:11001011则:a&b为10001001(都为1时才为1)a^b为01100110(同号为0,异号为1)a|b为11101111(都为0时才为0)优先级:~高于&,&高于^,^高于|。位操作运算符位运算是指直接对int型或char型数据的各位进262、移位运算符(<<、>>)移位运算是指将一个操作数中的各位都向左(用<<)或向右(用>>)移动若干位。如:a:10001101则:

a<<3为01101000a>>4为000010002、移位运算符(<<、>>)27赋值运算符如:

I=j=k=5;则等效于:

k=5;j=k;I=j;当赋值号两边的数据类型不一致时,编译器会在赋值前将右操作数自动转换为同左操作数相同的类型。如:

inta=3.14;//a:3注意:1、赋值运算符=与比较运算符==的混淆。2、intx=1;

与intx;x=1;在概念上的区别。

赋值运算符如:28在C++中,将算术运算符、位运算符同赋值运算符结合可形成复合赋值运算符。一共有十种:+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=。如:

a+=b

等效于a=a+b注意:运算时右边的表达式是被作为一个整体参与运算的。如:

a*=3+b等效于a=a*(3+b)而不是等效于a=a*3+b在C++中,将算术运算符、位运算符同赋值运算符结合可形成复合29x=015=00001101y=0x2b=00101011x|y=0010111147x^y=0010011038x&y=000010019~x=11110010~y=11010100~x+~y=100000110x<<=3=01101000104y>>=4=0000

00102例题:位运算已知:unsignedintx=015,y=0x2bx=015=00001101例题:位运算已知:u30A:!a&&b++B:a||b+4&&a*bC:a=1,b=2,a>b?++a:++bD:++b,a=10,a+5E:a+=b%=a+bb=b%(a+b),a=a+b;F:a!=b>2<=a+1;inta(5),b(3);求表达式、a、b的值910,5,31,5,33,1,315,10,48,8,31,5,3简称:短路A:!a&&b++inta(5),b(3);求表达式、a31A:d+-rd;B:*pd*rd;C:++*pd-rd;D:++rd-d;intd(5),*pd=&d,&rd=d,求表达式的值A:0B:25C:0D:0;A:d+-rd;intd(5),*pd=&d,&rd=d32其他运算符1、条件运算符语法为:(条件表达式)?(条件为真时的表达式):(条件为假时的表达式)如:x=a<b?a:b;//实现把a和b

中较小的值赋给x条件运算符是C++中唯一的一个三目运算符。

ABTFP其他运算符1、条件运算符ABTFP332、逗号运算符语法为:表达式1,表达式2,…表达式nC++将顺序计算表达式1,表达式2,…表达式n的值。而整个逗号表达式的值是表达式n的值。如:

inta,b,c,d;d=(a=1,b=a+2,c=b+3);

则:

a、b、c、d的值分别为1、3、6、6最后一个表达式的值就是逗号表达式的值2、逗号运算符最后一个表达式的值就是逗号表达式的值343、强制类型转换运算符用来将指定的表达式的值强制为所指定的类型。格式为:<类型说明符>(<表达式>)或:(<类型说明符>)<表达式>

如:

inta;doubleb=3.8921;a=int(b)+(int)b;则:a值为6注意:是对所求表达式的值指定类型,并不是改变b变量的类型。3、强制类型转换运算符35运算符的优先级和结合性1、优先级共15种优先级。分别为:

元素/成员->单目->双目->三目->赋值->逗号常用的双目运算符的优先级又分为:

算术->移位->关系->逻辑位->逻辑

2、结合性大多数为从左至右,只有三类是从右至左。分别为:单目、三目和赋值

除最高的元素成员,最低的逗号外,其余的一二三赋值,对双目运算:算术关系逻辑,移位逻辑位放中间口诀:运算符的优先级和结合性1、优先级2、结合性除最高的元素成员,363.5表达式表达式的种类表达式的值和类型表达式中的类型转换3.5表达式表达式的种类37表达式的种类表达式是由运算符和操作数组成的式子。常见的有如下6种:

算术表达式。如:a+5.2/3.0逻辑表达式。如:!a&&8||7关系表达式。如:'m'>='n'赋值表达式。如:a=7条件表达式。如:a>4?++a:--a逗号表达式。如:a+5,a=7,a+=4表达式的种类表达式是由运算符和操作数组成的式子。38表达式的值和类型任何一个表达式经过计算都应有一个确定的值和类型。

计算一个表达式的值时要注意两点:先确定运算符的功能。再确定计算顺序。要注意优先级和结合性的影响。一个表达式的类型由运算符种类和操作数类型来决定。如:1、算术表达式

inta=7*2+-3%5-4/3;//a:10floatb=510+3.2e3-5.6/0.03//b:3523.33intm(3),n(4);a=m++-(--n);//a:0m:4n:3表达式的值和类型任何一个表达式经过计算都应有一个确定的值和类39如:2、关系表达式

charx('m'),y('n');intn;n=x<y;//n:1n=x==y-1;//n:1n=('y'!='Y')+(5>3)+(y-x==1);//n:3如:3、逻辑表达式

inta(3),b(0);!a&&a+b&&a++;//a:3a||b||b++//b:0注意:C++规定:在一个逻辑表达式中,当计算出一个子表达式的值后便可确定整个逻辑表达式的值时,后面的子表达式就不再计算。简称:短路如:2、关系表达式如:3、逻辑表达式简称:短路40如:4、条件表达式

inta(3),b(4),c;c=a>b?++a:++b;//c:5c=a-b?a+b:a-3?b:a;//c:8从右向左结合c=a-b?a+b:(a-3?b:a);//相当于如:5、赋值表达式

intx(1),y(3),z(5);//从右向左结合x+=y*=z-=2;//?(10,9,3)z=(x*=2)+(y+=4)+2;//?(2,7,11)如:6、逗号表达式

inta,b,c;a=1,b=2,c=a+b+3;//c:6c=(a++,a+=b,a+b);//c:6

如:4、条件表达式如:5、赋值表达式如:6、逗号表达式41表达式中的类型转换1、隐含转换一般双目运算中的两个操作数的类型是要一致,不一致则自动将低类型的数据向高类型转换,然后再运算并得到高类型的表达式值。所谓的类型高低关系如下:short,char->int->long->double,float->double如:3+4.0'a'-4

2、强制转换将某种类型强制转换为指定的类型。并分为显式和隐式两种。如:b=a+int(3.14);//显式转换如:inta(5),b;b=a+3.14;//两次隐式转换表达式中的类型转换1、隐含转换42类型定义即通过关键字typedef来为现有类型取别名。如:typedefdoublewages,bonus;作用:

改善程序的可读性。(取一个有意义的类型别名)减少定义变量的过于繁琐。提高程序的可移植性。类型定义即通过关键字typedef来为现有类型取别名。43*********************第1行一个*第2行二个*。。。。。第N行N个*inti,j,n;cout<<"请输入要打印的行数:";cin>>n;for(inti=1;i<=n;i++){

for(j=1;j<=i;j++)cout<<"*";//打印若干个*

cout<<endl;//换行}*********************for(j=1;j<=n-i+1;j++)*第1行一个*inti,j,n;******for(j=144@@@@*@@@***@@*****@****************第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(inti=1;i<=5;i++){for(j=1;j<=5-i;j++)cout<<"@";//打印若干个@

for(k=1;k<=2*i-1;k++)cout<<"*";//打印若干个*cout<<endl;//换行}@@@@*第1行:4个@,接着1个*,换行每行@的个数:5-4512124634734747打印九九乘法口诀表#include"iostream.h"#include"iomanip.h"//manipulate,操作voidmain(){inti,j;for(i=1;i<=9;i++) {for(j=1;j<=9;j++) cout<<i<<"*"<<j<<"="<<setw(2)<<i*j<<""; cout<<endl; }}设置后面内容宽度为2for(j=1;j<=10-i;j++)for(j=1;j<=i;j++)打印九九乘法口诀表#include"iostream.h"48for(i=1;i<=9;i++){for(k=1;k<=9-i;k++)cout<<"";//7个空格for(j=1;j<=i;j++)cout<<i<<"*"<<(9-i+j)<<"="<<setw(2)<<i*(9-i+j)<<"";Cout<<endl;}for(i=1;i<=9;i++)49323250#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++)

//限定为两个位置的长度

cout<<setw(2)<<i<<"";

cout<<endl;}}#include"iostream.h"51条件语句格式:if(<条件1>)<语句1>elseif(<条件2>)<语句2>elseif(<条件2>)<语句2>……elseif(<条件n>)<语句n>else<语句n+1>条件语句条件语句格式:条件语句52000<条件1><语句1><条件2><语句2><条件n><语句n><语句n+1>非0非0非0000<条件1><语句1><条件2><语句2><条件n><语53格式如下:switch(<整型表达式>){case<整常型表达式1>:<语句序列1>case<整常型表达式2>:<语句序列2>……case<整常型表达式n>:<语句序列n>default:<语句序列n+1>//可无}语义为:根据对整型表达式的计算得到的值,从第一个case常量开始从上到下逐个进行匹配,若相等,则以此为入口,顺序向下执行各条语句序列。开关语句格式如下:语义为:开关语句54格式如下:switch(<整型表达式>){case<整常型表达式1>:<语句序列1>;break;case<整常型表达式2>:<语句序列2>;break;……case<整常型表达式n>:<语句序列n>;break;default:<语句序列n+1>//可无}通过加break强行跳转语句,在执行完第一个语句序列后,就强行跳出switch结构格式如下:通过加break强行跳转语句,在执行完第一个语句序55格式:for(e1;e2;e3)<语句体>计算e2执行<语句>非00退出循环计算e1计算d3e1;while(e2){<语句>;e3;}

for循环语句格式:计算e2执行<语句>非00退出计算e1计算d3e1;f56格式:break;该语句在程序中可用于下列两种情况:1、在开关语句中,其功能是退出开关语句,执行其后的语句;2、在循环体中,其功能是用来退出该重循环break语句格式:break语句57#defineM10voidmain(){ intnum,sum(0); cout<<"inputnumber:"; for(inti=0;i<M;i++) { cin>>num; if(num<0)break; sum+=num; } cout<<"sum="<<sum<<endl;}求10个数之和,遇负数终止#defineM10求10个数之和,遇负数终止58格式:continue;功能:只用在循环体中,用来结束该次循环。在循环体中遇到continue语句时,本次循环结束,回到循环条件判断是否执行下一次循环。continue语句格式:continue语句59#defineM10voidmain(){ intnum,sum(0); cout<<"inputnumber:"; for(inti=0;i<M;i++) { cin>>num; if(num<0)continue; sum+=num; } cout<<"sum="<<sum<<endl;}求10个中的正数之和#defineM10求10个中的正数之和60m是素数的条件是不能被2,3,…,m-1整除。

longm;cout<<"pleaseinputanumber:\n";cin>>m;//输入for(intI=2;I<m;I++) if(m%I==0)break;//处理if(I>=m)cout<<m<<"isprime.\n";elsecout<<m<<"isn'tprime.\n";//输出

判断整数

m其是否为素数m是素数的条件是不能被2,3,…,m-1整除。判断整数

m其61快速算法:判断它能否被2到sqrt(m)之间的数整除,若不能则是素数。

longm;cout<<"pleaseinputanumber:\n";cin>>m;

intsqrtm=sqrt(m);for(intI=2;I<=sqrtm;I++) if(m%I==0)break;//处理if(I>=sqrtm+1)cout<<m<<"isprime.\n";elsecout<<m<<"isn'tprime.\n";//输出

判断素数的快速算法快速算法:判断它能否被2到sqrt(m)之间的数整除,若不能62分析程序运行结果。

intI(1),a(0);for(;I<=5;I++)

{

do{i++; a++;}while(I<3);

I++;

}cout<<a<<","<<I<<endl;

Ia1021i<3成立32i<3不成立45for(;I<=5;I++)6378for(;I<=5;I++)分析程序运行结果。Ia1021i<3成立32i<3不成立4563本讲作业11、编程实现两个浮点数的四则运算;2、编程求出50至100之内的素数并输出;3、求两个数的最大公约数和最小公倍数;4、求一元二次方程ax2+bx+c=0的解;5、打印如下图形:122333444455555666666………101010101010101010本讲作业11、编程实现两个浮点数的四则运算;641、打印以下图形:AABCABCDEABCDEFG…ABCDEFG….S本讲作业22、百钱买百鸡。公鸡每只7元,母鸡每只5元,小鸡1元3只,用100地元买100只鸡(每种鸡都要有),请问公鸡母鸡小鸡各有多少?3、编程求水仙花数。水仙花数是指一个三位数,如果其各位数的立方和刚好等于该数本身)。如153=13+53+334、求1000以内的所有完数(指一个数恰好等于它的包括1在内的所有因子之和)。如6=1+2+35、将100元兑换成10、5、1元,有哪些兑换方法?1、打印以下图形:本讲作业22、百钱买百鸡。公鸡每只7元,母65voidmain(){doubled1,d2;charop;doubletemp;cout<<"inputd1opd2:";cin>>d1>>op>>d2;switch(op){case'+':temp=d1+d2;break;case'-':temp=d1-d2;break;case'*':temp=d1*d2;break;case'/':temp=d1/d2;break;default:cout<<"error!\n";}cout<<d1<<op<<d2<<"="<<temp<<endl;}voidmain()66#include<iostream.h>#include<math.h>#defineMIN51#defineMAX100voidmain(){inti,j,k,n(0);for(i=MIN;i<=MAX;i+=2){k=(int)sqrt(double(i));for(j=2;j<=k;j++)if(i%j==0)break;

if(j>=k+1){if(n%6==0)cout<<endl;n++;cout<<""<<i;

}//if

}//forcout<<endl;}//结束编程求出50至100之内的素数if(j>=k+1)编程求出50至100之内的素数67求两个数的最大公约数inta,b,r;cout<<"输入第一个数:";cin>>a;cout<<"输入第二个数:";cin>>b;if(a<b)r=a,a=b,b=r;//交换两数r=a%b;while(r) {a=b;b=r;r=a%b;}//辗转相除cout<<"最大公约数:"<<b<<endl;求两个数的最大公约数inta,b,r;68求两个数的最小公倍数inta,b,s;cout<<"输入第一个数:";cin>>a;cout<<"输入第二个数:";cin>>b;s=a;while(1) { if(s%b==0)break;s+=a;}cout<<"最小公倍数:"<<s<<endl;求两个数的最小公倍数inta,b,s;69inta,b;cout<<"输入第一个数:";cin>>a;cout<<"输入第二个数:";cin>>b;while(a!=b) { if(a>b)a-=b;if(a<b)b-=a; }cout<<"最大公约数:"<<a<<endl;求两个数的最大公约数(2)inta,b;求两个数的最大公约数(2)70inta,b,k;cout<<"输入第一个数:";cin>>a;cout<<"输入第二个数:";cin>>b;k=a*b;while(a!=b) { if(a>b)a-=b;if(a<b)b-=a; }cout<<"最小公倍数:"<<k/a<<endl;求两个数的最小公倍数(2)inta,b,k;求两个数的最小公倍数(2)71inta,b;cout<<"输入第一个数:";cin>>a;cout<<"输入第二个数:";cin>>b;if(a<b)r=a,a=b,b=r;//交换两数for(inti=b;i>=1;i--) if(a%i==0&&b%i==0){cout<<"最大公约数:"<<i<<endl;break;}

求两个数的最大公约数(3)inta,b;求两个数的最大公约数(3)72inta,b,k;cout<<"输入第一个数:";cin>>a;cout<<"输入第二个数:";cin>>b;if(a<b)r=a,a=b,b=r;//交换两数

for(inti=a;;i++) if(i%a==0&&i%b==0){cout<<"最小公约数:"<<i<<endl;break;}求两个数的最小公倍数(方法3)inta,b,k;求两个数的最小公倍数(方法3)73指针引用运算符语句课件74第三讲

指针引用运算符语句

第三讲

指针引用运算符语句本讲内容上次作业讲解指针及其应用引用运算符循环语句本讲作业76本讲内容上次作业讲解23.1指针和引用指针指针和数组引用3.1指针和引用指针77指针

具有指针类型的变量统称为指针变量。指针变量所表示的数据值是某个变量在内存中的地址值。称这个指针指向该变量。

指针的类型是它所指向变量的类型,而不是指针本身数据值的类型,因为任何指针本身数据值的类型都是unsignedlongint型。

如:

inta=5;int*p=&a;

//定义一个指向整型变量空间的指针,并初始化为整型变量a的起始地址,使p指向a。1、指针概念5p1001a

10012003指针具有指针类型的变量统称为指针变量。1、指针782、指针的定义格式为:<类型>*<指针变量名>;例如:

int*pi;

//一个指向整型变量的指针

float*pl;

char*pc;char(*pa)[3];

//一个指向数组空间的指针

int**pp;

//一个指向指针变量空间的指针

注:类型的不同,并不影响指针本身空间大小的不同(都是内存地址值),但却决定了指针所指向的空间的不同,也带来了对指针所指向空间的不同操作。可以指向,但还未指向P2003100120一个整型空间10012、指针的定义格式为:<类型>*<指针变79一、赋值运算定义一个指针后,必须先给它赋值后才能引用,否则易出错。

如:

inta=1,*p1,*p2;p1=&a;

//赋给同类型的变量地址值p2=p1;

//赋给同类型的指针变量的值

*p1=2;//给p1所指向的变量赋值*p2=3;//给p2所指向的变量赋值

3、指针的运算P1a*P1*P2P2.123此处无**代表取值一、赋值运算3、指针的运算P1a*P1P280二、加一或减一运算如:inta[10],*p;p=a;//p指向数组a中的a[0]元素p=p+1;

//这时p指向a[1]三、相减运算(一定条件下)如:

inta[10],*p1,*p2;p1=&a[2];p2=&a[5];

//分别指向数组中的不同元素

intm=p2-p1;

//所得为指针间相隔的元素个数P20031001a[0]a100110051009100d1011a[1]a[2]a[3]a[4]P200310050x00428D54指针地址是无符号长整形:4byte二、加一或减一运算三、相减运算(一定条件下)P200310081C++中,数组元素可以用下标表示也可用指针表示。1、一维数组的指针表示如:

inta[5];

a[2]=3;

//下标表示a[i]

*(a+2)=3;

//指针表示*(a+i)其中a是数组名,C++规定数组名是一个常量指针,其值是该数组首元素的地址值。如:

inta[5],*p;p=a;//与p=&a[0]等效

p=p+1;*p=4;

//将4赋给a[1]

注意:a=a+1;

//错误!为什么?指针和数组C++中,数组元素可以用下标表示也可用指针表示。指针和数组822、二维数组的指针表示如:

intb[3][4];b[2][3]=3;//下标表示b[i][j]*(*(b+2)+3)=3;

//指针表示*(*(b+i)+j)其中b是二维数组名,对于b而言,b[0]等是其元素,但要注意这些元素的类型并不是int型,而是相当于int[3]型。因此,我们称b[0]等为第0行。其中b[0]行中有b[0][0]~b[0][2]三个元素,注意这些元素的类型才是int型。则有以下表示方式:

b[1][2]*(b[1]+2)(*(b+1))[2]*(*(b+1)+2)b[0]b[1]b[2]b[0][0]b[0][1]b[0][2]b[0][3]b[1][0]b[1][1]b[1][2]b[1][3]b[2][0]b[2][1]b[2][2]b[2][3]b2、二维数组的指针表示b[0]b[0][0]b83#include"iostream.h"voidmain(){inta[12],*p=a;for(inti=0;i<12;i++){ *p=i+1;//元素赋值if(i%4==0)cout<<endl; cout<<*p<<"\t"; p=p+1; }}123456789101112a[12]pa[0]a[1]a[2]a[9]a[10]a[11]*pa[0],指针下跳1,*pa[1]给一维数组赋值并按每4个一行方式输出#include"iostream.h"12345678984123456789101112a[2][3]a[0][0]inta[3][4];int*pa=&a[0][0];//指针指向数组首元素for(inti=1;i<=12;i++){

*pa=i;//给元素赋值cout<<*pa<<"\t";//输出元素的值pa=pa+1;//指针往下走一单元

//如果是4的倍数换行if(i%4==0)cout<<endl;}给二维数组赋值并按每4个一行方式输出123456789101112a[2][3]a[0][0]i85行i组j列kabcd\0uvwx\0abcde\0s[6]pchars[6]="abcde";char*p=s;cout<<p<<"or"<<s;p=p+1;cout<<p;行i组j列kabcd\0uvwx\0abcde\0s[6]p86[例3.1]#include<iostream.h>voidmain(){staticinta[5]={5,4,3,2,1};inti,j;i=a[0]+a[4];//下标表示j=*(a+2)+*(a+4);//指针表示cout<<i<<"\t"<<j;int*pa=a;pa=pa+1;//pa=?*pa=?pa++;;//pa=?*pa=?

a[0]、a[1]、a[2]=?}

101154321a[0]a(1001)100110051009100d1011a[1]a[2]a[3]a[4]1009641005410093543[例3.1]10115a[0]a(1001)1001a[1]87

[例3.2]

#include<iostream.h>voidmain(){staticintb[][4]={{1,2,3},{4},{5,6}};b[0][2]=7;b[1][2]=8;cout<<**b<<"\t"<<**(b+1))<<"\n";cout<<*(*b+1)<<"\t"<<*(*(b+1)+2)<<"\n";cout<<b[0][2]+b[1][2]+b[2][2];}b[0]b[1]b[2]b[0][0]b[0][1]b[0][2]b[0][3]b[1][0]b[1][1]b[1][2]b[1][3]b[2][0]b[2][1]b[2][2]b[2][3]b12304000560078输出结果为:142815[例3.2]b[0]b[0][0]b178输88#include"iostream.h"voidmain(){ staticchars1[]="abcde",s2[5]={'m','n','p','q','\0'}; char*ps=s1; cout<<s1<<"or"<<s2<<endl; cout<<ps<<'\n'; cout<<s2[1]<<s2[2]<<s1[3]<<s1[4]<<endl; cout<<*ps<<*(ps+2)<<*(ps+4)<<*ps+2;}abcdeormnpqabcdenpdeace99abcde\0mnpq\0S1S2ps#include"iostream.h"abcdeor89intA[4]A[0]A[1]A[2]A[3]100010041008100CintB[4][4]B[0]B[1]B[2]B[3][0][1][2][3]intA[4]A[0]A[1]A[2]A[3]1000190用数组存放26个字母并输出#include"iostream.h"voidmain(){ chars[26]; for(inti=0;i<26;i++){s[i]='A'+i;//s[i]=65+i //给数组元素赋值cout<<s[i]<<"";//输出数组}

}ABCDEFGHIJKLMNOPQ用数组存放26个字母并输出ABCDEFGHI91引用作为一种数据类型,通常被认为是另一种变量的别名。其定义格式为:

<类型>&<引用名>=<变量名>;如:inta=3;int&m=a;m=m+5;则m是对a的一个引用,所有对m的操作都是对a的操作。注意:引用必须初始化,且一旦被初始化后不能再被重新赋值。即不能改变引用目标。3.2引用ma3.8引用作为一种数据类型,通常被认为是另一种变量的别名。3.292引用可以针对一个常量。

如:int&d=120;这时,引用的是一个系统为保存常量120而自动建立的临时变量空间。相当于:intt=120;int&d=t;引用可以针对一个常量。933.3运算符算术运算符关系运算符逻辑运算符位操作运算符赋值运算符其他运算符运算符的优先级和结合性3.3运算符算术运算符94算术运算符单目运算符(-(负))双目运算符(+(加)、-(减)、*(乘)、/(除)、%(模,求余)优先级为:负号级别最高,其次为*/%,再就是+-。要求:操作数为数值型数据其中%要求为整型/与%的第二操作数不为0特别注意“/”,当分子分母都是整数是做整除!1、普通算术运算符算术运算符单目运算符(-(负))1、普通算术运算符952、增1和减1运算符增量操作表示加1,减量操作表示减1。如:inta=4;

a++;

//等效于a=a+1;

++a;

//等效于a=a+1;

a--;

//等效于a=a-1;

--a;

//等效于a=a-1;增量操作符有前增量与后增量之分。前增量操作++a的意义为:先修改操作数的值再将增1后的a值作为表达式的值。而后增量操作a++的意义为:先将a的值作为表达式的值确定下来,再将a增1。2、增1和减1运算符96如:inta=3;intb=++a;intc=a++;则:a:5,b:4,c:4。相应的,有--a和a--。增量和减量操作符都是单目操作符。近水楼台先得月4a值表达式值a值表达式值++aa++345444如:近水楼台先得月4a值表达式值a值表达式值++aa++3497关系运算符C++提供了6种关系运算符:〈(小于)、〉(大于)、〈=(小于等于)、〉=(大于等于)、==(等于)、!=(不等于)

关系运算符都是双目运算符。优先级:〈、〉、〈=、〉=四种比==、!=两种要高要求:两个操作数为同一类型其结果值为1(代表逻辑真)或0(代表逻辑假)。关系运算符C++提供了6种关系运算符:98逻辑运算符三种逻辑运算符:

&&(逻辑与)、||(逻辑或)、!(逻辑非)。其中逻辑非为单目运算符,逻辑与和逻辑或为双目运算符。优先级:!的优先级最高,而&&又比||要高。逻辑表达式中的操作数是作为逻辑量,但C++并不专门提供逻辑类型,只用1与0来代表逻辑结果真与假。对于参与逻辑运算的操作数,其值为0代表逻辑假,为非0时代表逻辑真。如:!(a==9)逻辑运算符三种逻辑运算符:99位操作运算符位运算是指直接对int型或char型数据的各位进行运算。C++中的位运算符有两类:1、按位逻辑运算符共有四种:(按位取反运算符)~、(按位与运算符)&(按位异或运算符)^、(按位或运算符)|如:a:01101110,则~a为10010001(按位取反)如:a:10101101,b:11001011则:a&b为10001001(都为1时才为1)a^b为01100110(同号为0,异号为1)a|b为11101111(都为0时才为0)优先级:~高于&,&高于^,^高于|。位操作运算符位运算是指直接对int型或char型数据的各位进1002、移位运算符(<<、>>)移位运算是指将一个操作数中的各位都向左(用<<)或向右(用>>)移动若干位。如:a:10001101则:

a<<3为01101000a>>4为000010002、移位运算符(<<、>>)101赋值运算符如:

I=j=k=5;则等效于:

k=5;j=k;I=j;当赋值号两边的数据类型不一致时,编译器会在赋值前将右操作数自动转换为同左操作数相同的类型。如:

inta=3.14;//a:3注意:1、赋值运算符=与比较运算符==的混淆。2、intx=1;

与intx;x=1;在概念上的区别。

赋值运算符如:102在C++中,将算术运算符、位运算符同赋值运算符结合可形成复合赋值运算符。一共有十种:+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=。如:

a+=b

等效于a=a+b注意:运算时右边的表达式是被作为一个整体参与运算的。如:

a*=3+b等效于a=a*(3+b)而不是等效于a=a*3+b在C++中,将算术运算符、位运算符同赋值运算符结合可形成复合103x=015=00001101y=0x2b=00101011x|y=0010111147x^y=0010011038x&y=000010019~x=11110010~y=11010100~x+~y=100000110x<<=3=01101000104y>>=4=0000

00102例题:位运算已知:unsignedintx=015,y=0x2bx=015=00001101例题:位运算已知:u104A:!a&&b++B:a||b+4&&a*bC:a=1,b=2,a>b?++a:++bD:++b,a=10,a+5E:a+=b%=a+bb=b%(a+b),a=a+b;F:a!=b>2<=a+1;inta(5),b(3);求表达式、a、b的值910,5,31,5,33,1,315,10,48,8,31,5,3简称:短路A:!a&&b++inta(5),b(3);求表达式、a105A:d+-rd;B:*pd*rd;C:++*pd-rd;D:++rd-d;intd(5),*pd=&d,&rd=d,求表达式的值A:0B:25C:0D:0;A:d+-rd;intd(5),*pd=&d,&rd=d106其他运算符1、条件运算符语法为:(条件表达式)?(条件为真时的表达式):(条件为假时的表达式)如:x=a<b?a:b;//实现把a和b

中较小的值赋给x条件运算符是C++中唯一的一个三目运算符。

ABTFP其他运算符1、条件运算符ABTFP1072、逗号运算符语法为:表达式1,表达式2,…表达式nC++将顺序计算表达式1,表达式2,…表达式n的值。而整个逗号表达式的值是表达式n的值。如:

inta,b,c,d;d=(a=1,b=a+2,c=b+3);

则:

a、b、c、d的值分别为1、3、6、6最后一个表达式的值就是逗号表达式的值2、逗号运算符最后一个表达式的值就是逗号表达式的值1083、强制类型转换运算符用来将指定的表达式的值强制为所指定的类型。格式为:<类型说明符>(<表达式>)或:(<类型说明符>)<表达式>

如:

inta;doubleb=3.8921;a=int(b)+(int)b;则:a值为6注意:是对所求表达式的值指定类型,并不是改变b变量的类型。3、强制类型转换运算符109运算符的优先级和结合性1、优先级共15种优先级。分别为:

元素/成员->单目->双目->三目->赋值->逗号常用的双目运算符的优先级又分为:

算术->移位->关系->逻辑位->逻辑

2、结合性大多数为从左至右,只有三类是从右至左。分别为:单目、三目和赋值

除最高的元素成员,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论