c++指针教程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

chap5上一页下一页【教学目的与要求】理解指针的基本概念和定义方法,指针与数组的的关系,掌握指针的基本操作,引用的使用,动态内存管理。【教学重点与难点】指针的基本操作,引用的使用,动态内存管理。【教学方法】讲授与上机相结合。chap5上一页下一页指针的概念;指针变量;指针运算;指针与数组;引用变量;动态存储分配本章主要内容:chap5上一页下一页一、数据的存取1、内存地址内存的每个字节都有一个编号,这个编号称为“内存地址”。…低地址高地址2000200220043000程序中的每个数据都对应着内存中的一个地址,从该地址开始的一个或多个字节用来存放该数据。shortinti,j,k;ijk2、内存单元的地址和内存单元的内容的区别:若i=3,j=5;00000011000000000000010100000000注意:在内存中并不存在变量名,对变量值的存取都是通过地址进行的。6.1指针的概念chap5上一页下一页二、直接访问和间接访问1、直接访问方式:…低地址高地址2000200220043000ijk00000011000000000000010100000000①、i=3;②、j=i+2;③、couti;④、cini;⑤、k=i+j;00001000000000002、间接访问方式:C++还可以定义和使用一种特殊类型的变量,用来存放变量的地址。这种特殊类型的变量就是指针变量。chap5上一页下一页三、指针与指针变量把一个变量的地址称为该变量的“指针”。…低地址高地址2000200220043000ijk000000110000000000000101000000000000100000000000ip2000如果一个变量专门用来存放另一个变量的地址,则称它为“指针变量”。指针变量的值(即指针变量中存放的值)是指针(地址)。注意区分“指针”和“指针变量”这两个概念。chap5上一页下一页②、数据所占有的内存单元个数是由其数据类型决定的;③、首地址:即第一个字节的地址,(也称为该变量的存储地址,简称为变量的地址);④、变量i、j的地址可能相邻,也可能不相邻,是由系统分配的,我们不必关心。四、说明①、程序中定义的每个变量在编译后都占有各自的内存单元,系统是通过内存地址对变量进行存取的;返回chap5上一页下一页一、指针变量的定义1、格式:类型名*指针变量名[=指针表达式],…;其中:①、“*”表示定义的是指针变量;②、“类型名”用来指定该指针变量可以指向的变量的类型;2、例:inti,*ip;floatx,*xp;char*cp1,*cp2;6.2指针变量chap5上一页下一页3、说明:①、“*”只表示定义的变量为指针变量,但指针变量名中并不包含“*”;“*”是指针变量的标志,不可丢掉;②、指针变量定义时,指定了它所指向的变量的数据类型;指针变量定义时必须指定其所指向的变量的数据类型,而且使用过程中只能指向同一种类型的变量。③、指针变量定义后,系统为变量分配一个存储单元,用来存放地址;长度为4Byte;chap5上一页下一页二、指针变量运算符1、取地址运算符:&是单目运算符,用来返回操作数的地址。它与一个变量或数组元素连用。例如,inta=2;int*p;p=&a;可以通过&运算符,将某一变量的地址赋值给指针变量不定p2a&achap5上一页下一页2、间接访问运算符:*是单目运算符,用来返回操作数所指向的变量。它与一个指针变量连用。如:p代表指针变量,*p表示p所指向的变量。即*p也代表一个变量。chap5上一页下一页三、指针变量的赋值1、赋值语句:inti,j,*p1,*p2;p1=&i;p2=&j;charch,*cp1,*cp2;cp1=&ch;cp2=&ch;2、初始化:intx=4;intx;x=4inti,*p1=&i;inti,*p1;p1=&i;chap5上一页下一页四、说明:②、只能是同类型变量的地址进行赋值;inti,*ip;charch,*cp;ip=&i;cp=&ch;ip=&ch;cp=&i;③、可以将数组名或函数名赋给某些类型的指针变量;inta[10],*ip;ip=a;④、不能将一个整型量(或任何其它非地址类型的数据)赋给一个指针变量;也不能把指针变量的值赋值给整型变量;int*ip;ip=3000;⑤、分析有关指针的程序时,画图是很好的方法:inti,*p;不定i不定p&i5p=&i;i=5;①、注意指针在使用之前,要先进行赋值。否则不确定。chap5上一页下一页inta,*p1,*p2;不定a不定p1不定p2p1=&a;&acoutp1;p2=p1;&a*p1=3;3cout*p1;五、指针变量的引用chap5上一页下一页在上面定义语句中,两个“*”号表示定义的指针为一个二级指针。是指向指针变量的指针变量。六、二级指针变量(指向指针的指针)定义形式:数据类型**指针名;如:intx=5,*px=&x,**pp=&px;chap5上一页下一页指针数组中的每一个元素都是一个指针变量,并且它们具有相同的存储类型和指向相同的数据类型。与普通数组一样,在使用指针数组之前,必须先对其定义。指针数组的定义形式为:数据类型*指针数组名[元素个数];七、指针数组当一系列有次序的指针变量集合成数组时,就形成了指针数组。例如;int*p[2];它定义了指针数组是由p[0]和p[1]两个指针组成,它们都指向int型数据。chap5上一页下一页指针数组举例:#includeiostream.hvoidmain(){inta[5]={1,2,3,4,5};int*p[5]={&a[0],&[a1],&a[2],&a[3],&a[4];for(inti=0;i5;i++)cout*p[i];}12345&a[4]&a[3]&a[2]&a[1]&a[0]a[0]a[1]a[2]a[3]a[4]p[0]p[4]p[3]p[2]p[1]chap5上一页下一页补充:数组指针1.格式数据类型(*指针名)[元素个数]如:int(*p)[3],包含(*p)[0],(*p)[1],(*p)[2]注意:a.与int*p[3];的区别b.适用的对象为二维数组c.如果p指向了二维数组的某一行则p+1指向下一行p123p+1456int(*p)[5];所指向二维数组为几列?chap5上一页下一页数组指针举例:#includeiomanip.hvoidmain(){inta[2][3]={1,2,3,4,5,6};int(*p)[3];inti,j;p=a;for(i=0;i2;i++){for(j=0;j3;j++)coutsetw(3)(*p)[j];p++;}}chap5上一页下一页类型名*const指针名=初值表达式;指向常量的指针:定义的指针所指向的对象是常量(*p不可修改),但p可修改const类型名*指针名[=初值表达式];如intn=12;constint*p=&n;//以后n中的数据不可通过*p改变,但是可通过n改变.指针常量:指针(p)不能被修改,所指对象(*p)能修改,即指针不可再指向其它对象,但它所指向的对象是可以修改的八、指向常量的指针与指针常量必须初始化chap5上一页下一页#includeiostream.hvoidmain(){inta=10;int*p;p=&a;*p=15;couta=aendl;coutp=pendl;cout&a=&aendl;cout*p=*pendl;cout&p=&pendl;}例6.1.1理解指针的几种表示形式。应该正确理解这五种操作的意义。它们是a、p、&a、&p、*p(其中a为一般变量,p为指针变量)。*a是“非法间接引用”错误。chap5上一页下一页6.3指针运算2、两个运算符:&和*&:取地址运算符;*:指针运算符(间接访问符);说明:①、&既可作用于一般变量,也可作用于指针变量;②、*只能作用于指针变量;③、表达式中的*p与变量定义中的*p含义不同;inti,*p=&i;*p=5;④、inta,*p=&a;inta,*p;p=&a;inta,*p;*p=&a;inta,*p1,*p2;1、赋值=:p1=&a;p2=p1;注:指针在使用前必须先被赋值。赋值号两侧数据类型必须相同chap5上一页下一页3、增1(++)和减1(--):p++;p--;使指针值增加或减少所指数据类型的长度值(a)x=*p++;(b)x=*++p;(c)x=(*p)++;(d)x=++(*p);如:*和++是同级运算符,结合性为右结合性,结果是3相当于x=*(++p),结果是10结果是3结果是4inta[5]={10,15,20,25,30};int*p=a;//即int*p=&a[0]cout*p++;//右结合10p15++p;cout*p--;//20p15如:chap5上一页下一页p+=4;(只能和一个整数)4、加(+)和减(-)、加赋值(+=)和减赋值(-=):对不同类型的指针p、p±n表示的实际位置的地址值是:(p)±n×数据长度(字节)如:intb[6]={1,3,5,7,9,11};int*p=b,*q=p+5;//p-b[0],q-b[5]cout*(p++)'';//1p-b[1]注意:*p++与(*p)++的区别(*p)++;cout*pendl;//4p-b[1]cout*(q-3)endl;//5chap5上一页下一页两个指针做相减运算其结果是一个整数,它是两个指针所代表的内存地址位置之间的数据的个数。5、两个指针的相减运算:6、比较(==,!=,,=,,=):若一个指针在另一个指针的前面,则“”;对于数组,即指向前面元素的指针指向后面元素的指针如:if(pq)cout*p++'';应注意:在指向不同数据类型的指针之间进行关系运算是没有意义的,指针与一般整数常量或变量之间进行关系运算也是没有意义的。但指针与整数0之间可进行等或不等的关系运算,即p==0或p!=0用于判断指针是否为空指针。注意:两个指针变量相加无实际意义。chap5上一页下一页例6.3.1#includeiostream.hvoidmain(){inta1=11,a2=22;int*p1,*p2;p1=&a1;p2=&a2;cout*p1*p2endl;p2=p1;cout*p1*p2endl;}11a122a2不定p1不定p2&a1&a2*p1*p2&a1*p2*p2多个指针可以指向同一个存储单元。但在某一时刻,一个指针变量只能指向一个存储单元,因为指针变量在某一时刻只能存放一个变量的地址值。chap5上一页下一页例6.3.2使两个指针交换指向#includeiostream.hvoidmain(){inta1=11,a2=22;int*p1,*p2,*p;p1=&a1;p2=&a2;cout*p1*p2endl;p=p1;p1=p2;p2=p;cout*p1*p2endl}11a122a2不定p1不定p2不定p&a1&a2*p1*p2&a1&a2*p1*p1&a1*p2*p2chap5上一页下一页例6.3.3#includeiostream.hvoidmain(){inta1=11,a2=22,t;int*p1,*p2;p1=&a1;p2=&a2;couta1a2endl;t=*p1;*p1=*p2;*p2=t;couta1a2endl;}11a122a2不定t不定p1不定p2&a1*p1&a2*p2112211交换两个指针变量所指向变量的值Eg803.cppchap5上一页下一页#includeiostream.hvoidmain(){inta,b;int*p=&a,*q=&b,*t;coutpleaseinputa

1 / 59
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功