您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > 计算机语言C++指针
指针←→2主要内容指针的概念指针与地址操作符指针的声明指针的初始化指针运算指针与数组指针的指针void指针函数指针←→3校园生活举例到教务处办事教务处在校园什么位置或地址?综合办公楼4楼教务处→空间位置按空间位置行动,到达目的地任何单位有一个逻辑名称地址,还有一个物理空间地址人脑映射转换,控制行动←→4物理地址与逻辑地址物理地址一般由地理区域的序号编码构成逻辑地址一般由有意义的机构或人名构成人们常常喜欢记逻辑地址广东石油化工学院广东省茂名市官渡二路139号因为逻辑地址简单、形象、易记物理地址逻辑地址←→5工作举例办公桌的抽屉里存放文件柜抽屉的钥匙文件柜抽屉中存放各种资料从文件柜某个抽屉中取资料如何操作?打开办公桌抽屉取出相应编号的钥匙打开文件柜抽屉拿出资料办公桌、文件柜→存储器抽屉→存储单元存储单元存放“物品”→“地址”或“数据”←→6内存:256MB0x00000000x00000010x00000020x00000030xFFFFFFF0xFFFFFFE0x00000040x00000050x00000060x00000070x00000080x0000009物理地址168‘W’3.14159charch=‘W’;intk=168;floatPi=3.14159;逻辑地址内存储器地址与数据←→7地址译码器0x00000000x00000010x00000020x00000030xFFFFFFF0xFFFFFFE0x00000040x00000050x00000060x00000070x00000080x0000009物理地址编译系统逻辑地址物理地址内存:256MB‘W’1683.14159逻辑地址向物理地址变换←→8函数整型数据首地址首地址内存储器浮点数据字符数据首地址首地址结构体数据首地址C++程序的存储地址是存放信息数据的内存单元的编号(编码)C++程序是通过名字(变量或函数名)来使用内存。这样做既直观,又方便为某个变量或者函数分配存储器空间的工作由编译程序完成存放在内存中的函数和数据都至少有一个地址我们关心的是首地址:第一个字节的地址通过地址直接使用内存较为快捷←→9指针的概念用来存放内存地址的变量叫作指针变量,简称指针指针是C++语言中的一种数据类型,是专门用来处理地址码集合的。又叫地址类型、指针类型,由于“首地址”可以是整数变量的首地址,也可以是双精度变量首地址,指针变量也分为不同的类型指针是一个变量,应遵循“先声明,后使用”的原则←→10含义:取变量的地址单目运算符结合性:自右向左含义:从某个地址中获取数据,也叫取内容运算符。单目运算符结合性:自右向左两者关系:互为逆运算取地址运算符&与指针运算符*←→11存储器intx,*ipr;0x0013FF780x0013FF7C0x0013FF790x0013FF7A0x0013FF7B0x0013FF7D0x0013FF7E0x0013FF7Fxiprx=3;30x13FF78ipx=&x;*ipr=5;5直接访问:按变量地址存取变量值间接访问:通过存放变量地址的变量去访问变量←→12#includeiostream.hintmax(inta,intb){returnab?a:b;}voidmain(){intx=20,y=30;doublefib[1000]={0,1};cout输出变量x的地址:&xendl;cout输出变量y的地址:¥dl;cout输出数组fib[]的地址:fibendl;cout输出数组元素fib[1]的地址:&fib[1]endl;cout输出函数max()的地址:maxendl;}←→13#includeiostream.h//输入半径求圆面积voidmain(){doublearea,R,*dptr;dptr=&R;cout输入半径:;cin*dptr;dptr=&area;*dptr=3.14159*R*R;cout圆面积是*dptrendl;cout圆面积是areaendl;}←→14指针变量的声明指针变量声明语句格式:类型符*指针变量名;int*pi,*iptr;float*pf;double*pd;char*pc;int*number;char*character;float*greatnumber;←→15#includeiostream.hintmain(){intvalue1=5,value2=15;int*mypointer;mypointer=&value1;*mypointer=10;mypointer=&value2;*mypointer=20;coutvalue1=value1/value2=value2;return0;}←→16#includeiostream.hintmain(){intvalue1=5,value2=15;int*p1,*p2;p1=&value1;//将value1的地址赋给指针变量p1p2=&value2;//将value2的地址赋给指针变量p2*p1=10;//指针变量p1指向的变量赋予数值10*p2=*p1;//将指针变量p1指向的变量赋给指针变量p2所指向的变量p1=p2;//将指针变量p2的值赋给指针变量p1*p1=20;//指针变量p1所指向的变量赋予数值20coutvalue1=value1/value2=value2;return0;}←→17指针初始化intnumber;int*tommy=&number;intnumber;int*tommy;tommy=&number;←→18char*terry=“hello”;terry[4]='!‘;*(terry+4)='!‘;←→19指针运算赋值运算将一个指针赋值给另一个指针,结果是两个指针指向一个相同地址的单元例如:inta,*ip,*jp;jp=&a;ip=jp;结果是ip和jp都指向整数变量a←→20算术运算只进行加减算术运算,完成指针上下移动,对不同的类型,移动的单位长度不同指针算术运算符:++、--、、+、-例如:doublepi,*ptr=πptr++;表示指针ptr下移一个地址指针+整数表达式例如:ptr+3含义?指针-整数表达式例如:ptr-3含义?←→21注意:递增“++”和递减“--”操作符比引用操作符“*”有更高的优先级*p++等同于*(p++)*p++=*q++;等同于*p=*q;p++;q++;++*p←→22指针与数组可以用指针指向数组中每个元素C++规定单写数组名表示数组的首地址例如:floata[20],*fp=a;数组名本身就当作指针常量,等于&a[0]由于数组中的元素在内存中是连续排列存放,可以通过指针±整数来指向任何元素a[0]⇔*(fp+0)a[1]⇔*(fp+1)a[2]⇔*(fp+2)原来通过下标存取数组元素,现在可以通过指针来实现,这样更快捷←→23inta[5]={168,768,468,11168,2168};int*pa=a,*pp;pa++;cout*pa;??pa+=3;cout*pa;??pp=pa-2cout*pp;??pp-=2cout*pp;??问题:指向双精度数组的指针增1实际加多少?16876846811162168a[0]a[1]a[2]a[3]a[4]0x0012FF6Cox0012FF700x0012FF740x0012FF780x0012FF7C指针指向整型数组示例←→24#includeiostream.hintmain(){intnumbers[5];int*p;p=numbers;*p=10;p++;*p=20;p=&numbers[2];*p=30;p=numbers+3;*p=40;p=numbers;*(p+4)=50;for(intn=0;n5;n++)coutnumbers[n],;return0;}←→25计算机中处理数组时,实际上将A[i]转换成:*(A+下标表达式值)即有:A[i]⇒*(A+i)因为数组名表示该数组的首地址,所以:floatA[1000],*ptr=A;inti=0;则有:A[i]⇒*(A+i)⇒*(ptr+i)因此用指针处理数组及元素是最快捷方式←→26例:字符串复制函数开始声明字符数组S[],T[]声明整数变量I=0S[I]!=‘\0’T[I]=S[I]I=I+1T[I]=‘\0’结束√×开始声明字符数组S[],T[]char*sp=S,*st=T;*sp!=‘\0’*st=*spst++,sp++*st=‘\0’结束√×←→27#includeiostream.hvoidmystrcpy(char*destin,char*source){while(*source!=0){*destin=*source;source++;destin++;}*destin=0;}voidmain(){charstring1[100]=Iamfine!;charstring2[100];mystrcpy(string2,string1);coutstring2;}开始声明字符数组S[],T[]char*sp=S,*st=T;*sp!=‘\0’*st=*spst++,sp++*st=‘\0’结束√×←→28问题:编写一个函数将数组清零算法分析(用指针实现)①令指针P指向数组首地址②给指针指向的元素赋0值,即:*P=0③指针P++④重复②、③直到整个数组处理完毕为止;注意循环N次,N是数组元素的个数。←→29#includeiostream.hvoidclear_array(float*ptr,intn){float*qtr=ptr+n;while(ptrqtr){*ptr=0;ptr++;}}voidmain(){floata[10]={1,2,3,4,5,6,7,8,9,10};inti;for(i=0;i10;i++)cout‘\t’a[i];coutendl;clear_array(a,10);for(i=0;i10;i++)cout‘\t’a[i];cout\n;}←→30数组指针与指针数组char(*p)[20]与char*p[20]的区别chara[10][20],b[10][20];…if(..){a[i][j]…}else{b[i][j]…/*此分支与上一分支的唯一区别是:前者是对a,后者是对b操作*/}char(*p)[10][20];/*括号不能省略,否则p变成了指针构成的数组*/if(..){p=&a;}else{p=&b;}(*p)[i][j]…/*仅一份代码*/←→31指针的指针chara;char*b;char**c;a='z';b=&a;c=&b;←→32void指针指针void是一种特殊类型的指针。void指针可以指向任意类型的数据,可以是整数、浮点数甚至字符串。唯一一个限制是被指向的数值不可以被直接引用(不可以对它们使用引用操作符“*”),因为它的长度是不定的,因此,必须使用类型转换操作或赋值操作来把void指针指向一个具体的数据类型。←→33#includeiostream.hvoidincrease(void*data,inttype){switch(type){casesizeof(char):(*((char*)data))++;break;casesizeof(short):(*((short*)data))++;break;casesizeof(long):(*((long*)data))++;break;}}intmain(){chara=5;shortb=9;
本文标题:计算机语言C++指针
链接地址:https://www.777doc.com/doc-5584613 .html