您好,欢迎访问三七文档
第15章指针西南交通大学软件学院计算机基础教研室C++编程导论前一页休息2本章主要内容C++中指针的基本概念指针类型变量的定义方法指针与地址运算符指针变量赋值、指针的运算通过指针类型的变量去访问某个变量或数组元素的值引用动态分配内存按引用调用前一页休息3什么是地址?计算机的内存储器就象一个巨大的一维数组,每个数组元素就是一个存储单元(在微型计算机中其大小通常为一个字节)。就象数组中的每个元素都有一个下标一样,每个内存单元都有一个编号,又称地址。前一页休息4什么是地址?在运行一个程序时,程序本身及其所用到的数据都要放在内存储器中:程序、函数、变量、常数、数组和对象等,在内存储器中占有一席之地。存放在内存储器中的程序和数据都有一个地址,用它们占用的那片存储单元中的第一个存储单元的地址表示。前一页休息5什么是地址?在C++中,为某个变量或者函数分配内存储器的工作由编译程序完成。内存地址的访问方式–直接访问方式:通过变量名访问–间接访问方式:通过地址访问前一页休息6如何知道某个变量、数组、函数的地址C++规定:变量的地址可以使用地址运算符&求得。例如,&x表示变量x的地址;数组的地址,即数组第一个元素的地址,可以直接用数组名表示;函数的地址用函数名表示。前一页休息7什么是指针指针是C++语言中的一种数据类型,是专门用来处理地址的。指针是某个内存单元的首地址。前一页休息8什么是指针变量?指针变量是包含另一个变量地址的变量。指针变量也是一个变量,遵循先定义,后使用。定义指针变量的类型是由该指针指向的变量类型决定。前一页休息9指针变量的概念定义例:inti;int*i_pointer;指向整型变量的指针内存用户数据区变量i变量j变量i_pointer362000200020043010前一页休息10指针变量的声明变量的指针:变量在内存中的存放起始地址指针变量的声明:类型标识符*指针变量例如:int*p;①定义语句中的“*”表示该变量为指针变量②一个指针变量只能存储同一种类型变量的地址前一页休息11指针变量的初始化语法形式类型标识符*指针名=初始地址;例:int*pa=&a;前一页休息12指针变量的初始化注意事项用变量地址作为初值时,该变量必须在指针初始化之前定义。如:inta;int*pa=&a;已赋初值的指针可以初始化另一个指针变量。int*pa=&a;int*pb;pb=pa;前一页休息13指针与地址运算符“&”在执行语句中作为取地址运算符,它是一元运算符,返回操作数的地址,操作数必须是变量名。“*”除了可以在声明语句中声明指针时使用外,还可以在执行语句中作为为指针运算符使用,也称为“间接访问”运算符,指针运算符是一元运算符,指针运算符*表示指针所指向的变量的值。–&a:取变量a的地址。–*a:指针变量所指向的变量的值。–inty=5;int*p;p=&y;cout*p;前一页休息14指针与地址运算符*出现在声明语句和执行语句中的含义是不同的。int*p;//*在声明语句中表示声明的是指针,声明p是整型指针cout*p;//*在执行语句中表示指针所指对象的内容前一页休息15指针变量的赋值运算指针变量=地址p=&a;p=array;//将数组的首地址赋值给pp=&array[i];//将数组的第i个元素的地址赋值给pp=max;//将函数max的入口地址赋给pp1=p2;//将指针p2的值赋个指针p1前一页休息16指针变量的赋值运算指针变量=地址不能把常量或表达式的地址赋给指针变量。如:P=&67;P=&(i+5)是非法的不能将一个整数赋给指针变量,但可以赋整数值0,表示该指针空指针,不指向任何内容。指针的类型是它所指向变量的类型。允许声明指向void类型的指针。该指针可以被赋予任何类型对象的地址。例:void*general;前一页休息17例1指针的定义、赋值与使用#includeiostreamusingnamespacestd;voidmain(){int*i_pointer;inti;i_pointer=&i;i=10;cout“Outputinti=”iendl;coutOutputintpointeri=*i_pointerendl;}前一页休息18程序运行的结果是:Outputinti=10Outputintpointeri=10前一页休息19指针变量的算术运算指针与整数的加减运算–指针p加上或减去n,其意义是指针当前指向位置的前方或后方第n个数据的地址。–这种运算的结果值取决于指针指向的数据类型。指针加一,减一运算–指向下一个或前一个数据。前一页休息20papa-2pa-1pa+1pa+2pa+3*(pa-2)*pa*(pa+1)*(pa+2)*(pa+3)*(pa-1)short*pa前一页休息21pb-1pbpb+1pb+2*(pb-1)*pb*(pb+1)*(pb+2)int*pb前一页休息22关系运算两个指针变量指向同一个数组中的元素时,其关系运算的结果表明了这两个指针变量所指向的数组元素的先后关系指针可以和零之间进行等于或不等于的关系运算。例如:p==0或p!=0指针变量的关系运算前一页休息23指针的关系运算例如:chara[10];char*p1,*p2;p1=a+2;p2=a+4;p1++;p2--;前一页休息24指向数组元素的指针定义与赋值例:inta[10],*pa;pa=&a[0];或pa=a;前一页休息25指向数组元素的指针通过指针引用数组元素经过上述声明及赋值后,在执行语句中*pa就是a[0],*(pa+1)就是a[1],...,*(pa+i)就是a[i].a[i],*(pa+i),*(a+i),pa[i]都是等效的。不能写a++,因为a是数组首地址是常量。前一页休息26应用举例2设有一个int型数组a,有10个元素。用四种方法访问数组的各个元素:使用数组名和下标使用数组名和指针运算使用指针变量使用下标表示法引用指针指向的数组元素前一页休息27#includeiostreamusingnamespacestd;voidmain(){inta[10];inti,*p;for(i=0;i10;i++)cina[i];for(i=0;i10;i++)cout*(a+i);for(p=a;p-a10;p++)cout*p;p=a;for(i=0;i10;i++)coutp[i];}前一页休息28应用举例3#includeiostream#includeiomanipusingnamespacestd;voidmain(){constintM=20,N=10;inta[M],b[N],c[M];intd,e,f=0,*pa,*pb,*pc;从键盘输入整数集合a、b的元素个数和各个元素的值,计算并输出其交集前一页休息29cout输入数组a中元素的个数:endl;cind;cout输入数组a的d个元素:endl;for(pa=a;paa+d;pa++)cin*pa;cout输入数组b中元素的个数:endl;cine;cout输入数组b的e个元素:endl;for(pb=b;pbb+e;pb++)cin*pb;前一页休息30for(pa=a,pc=c;paa+d;pa++)for(pb=b;pbb+e;pb++)if(*pa==*pb){*pc++=*pa;f++;break;}cout交集c的各个元素依次为:endl;for(pc=c;pcc+f;pc++)coutsetw(3)*pc;}前一页休息31应用举例4#includeiostream#includeiomanipusingnamespacestd;voidmain(){constintM=20,N=10;inta[M],b[N],c[M+N];intd,e,f=0,*pa,*pb,*pc;从键盘输入整数集合a、b的元素个数和各个元素的值,计算并输出其并集前一页休息32cout输入数组a中元素的个数:endl;cind;cout输入数组a的d个元素:endl;for(pa=a;paa+d;pa++)cin*pa;cout输入数组b中元素的个数:endl;cine;cout输入数组b的e个元素:endl;for(pb=b;pbb+e;pb++)cin*pb;前一页休息33for(pa=a,pc=c;paa+d;pa++,pc++){*pc=*pa;f++;}for(pb=b;pbb+e;pb++){for(pa=a;paa+d;pa++)if(*pb==*pa)break;if(pa=a+d){*pc++=*pb;f++;}}cout“并集c的各个元素依次为:endl;for(pc=c;pcc+f;pc++)coutsetw(3)*pc;}前一页休息34字符指针来存储和处理字符串字符指针与字符串字符串是由字符数组中的结束标志符“\0”之前的字符组成的特殊数组,指向这一特殊数组的指针则称字符串指针。字符串指针的定义、赋值和引用与指向数组的指针基本相同前一页休息35用字符数组存储和处理字符串注意!若有如下定义:chara[4]=“abc”,*p2=a;cinp2;正确的//等价于cina;前一页休息36字符指针的定义、赋值和引用--例5#includeiostream#includestringusingnamespacestd;voidmain(){char*p,sa[20],sb[20];inti;p=sa;strcpy(sa,“TodayisSunday.”);for(i=0;*(sa+i)!=‘\0’;i++)sb[i]=*p++;sb[i]=‘\0’;p=sb;coutp;}前一页休息37动态存储分配静态存储分配:程序中使用的变量和数组的类型、数目、大小是由编写程序时确定的,程序运行时这些数据占用的存储空间数也是一定的。缺点:程序无法在运行时根据具体情况(如用户输入)灵活调整存储分配情况。动态存储分配:使用指针、运算符new和delete,在程序运行期间按照实际需要申请适量内存,克服了静态存储分配的缺点。前一页休息38动态申请内存操作符new指针=new类型指针=new类型(初值)功能:在程序执行期间,申请用于存放类型对象的内存空间,并依初值列表赋以初值。结果值:成功:类型的指针,指向新分配的内存首地址。失败:0(NULL)前一页休息39动态申请内存操作符new例如:intx,*p=newint(6);x=*p;coutx*pendl;deletep;前一页休息40动态申请内存操作符newnew运算符为数组申请内存使用形式:指针=new数据类型[数组大小]前一页休息41释放内存操作符deletedelete〈指针〉功能:释放指针P所指向的内存。P必须是new操作的返回值。前一页休息42使用动态存储分配时,应注意:确认分配成功后才能使用。分配成功后不宜变动指针的值。用运算符new获取的内存空间,必须用delete进行释放。对一个指针只能调用一次delete。在使用delete运算符进行释放时,不用考虑数组的维数。前一页休息43动态存储分配--例6从内存中获取一个整型数组,赋值后并打印出来。#includeiostream#includestdlibusingnamespacestd;voidmain(){intn,i;//定义数组元素的个数int*p;cout“pleaseinputthelengthofthearray:”endl;cinn;if((p=newi
本文标题:指针的定义和应用
链接地址:https://www.777doc.com/doc-4903556 .html