语言程序设计课件指针与引用_第1页
语言程序设计课件指针与引用_第2页
语言程序设计课件指针与引用_第3页
语言程序设计课件指针与引用_第4页
语言程序设计课件指针与引用_第5页
免费预览已结束,剩余88页可下载查看

下载本文档

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

文档简介

第5针指针的概 1指针的概

指针的概一个变量在内存中所占单元的地址号就是如:inti;假设i变量在内存中所占单元的地址号为0xaf12eef3,此时称0xaf12eef3这个地址2指针变量的定

指针的概专门存放其他变量地址的变量称为指针变量。和其他类型标识符号*指针变量名表如:inti=50;int*ip; 3指针的概类型标识符是该指针变量所要指向变量的类型(变量的指针和指向变量的指针变量的区分:指针是某一变量在内存中所占单元的地址,是一个地址值。而指针变量则是专门存放其他变量的地址的变量,是4指针的概与指针运算有关系的两个运算 如:inti=50;intip=&i;//&i——求变量i 单元的地(即指针)此时,指针变量ip存放了变量i的地址(指针),因此称指针变量ip此时是指向变量i的5指针的概*:取出指针变量所指向的变量的内容,后面即由于ip是指向变量i的,所以*ip与i是等价的。指针变量 ,即使用指针变量,其使用方6指针的概样,在内存中也占单元,因此一个指针变量也相当于一个容器,所以指针变量也有其指针,这就是指指针变量内只能存放其他变量的地址,而不能直一个指针变量只能指向同一个类型的变量,如上例中指针变量i一个指针变量只有先指向某一个变量后,才可利用该指针变量对它所指向的变量进行操作(间接访问7指针的概【例】指针变量及其使用usingnamespacestd;voidmain(void){intint*ip1,*ip2; ip1=&a;ip2=&b将变量a,b8指针的概cout<<a<<‘’<<b<<endl;cout<<*ip1<<‘’<<*ip2<<endl; //等价于 cout<<*ip1<<''<<*ip2<<endl;}//Demo:指针的算术运算9第5针指针的概 const指const指const类型标识*指针变量名;如:constint*p; const指const指include<iostream>usingnamespacestd;voidmain(void){ constinti=20;intk=40;constint*p;//定义指向常量的指针变量 *p=100;//该句错误,不可借助p对它所指向的目标进行重新赋值 }//main指针常

const指类型标识*const指针变量名=初始指针值;如:char*constp=”abcde”用该种方法定义的指针变量,其值(是一个指针值)不可进行修改,但可以借助该指针变量对其所指向的对象的值进行或修改。另外,这种指针在定义时必须初始化const指const指usingnamespacestd;voidmain(void){chars[]="askdfsljfl";char*constp=s; //,//向另外一个地址(指针 // const指指向常量的指针常const类型标识*const指针变量名=初始指针值;如:intb;constint*const用这种方法定义的变量,既不允许修改指针变量的值,也不允许借助该指针变量对其所指向的对象的值进行修改。另外,该变量在定义时必须初始化。如:const指usingnamespacestd;voidmain(void){inta=10;intc=30;constintb=20;constint*constp=&a;constint*constq=&b; //错}第5针指针的概 指针与函

指针与函前面讲过,函数的参数可以为整型、实型、字符型等普通变量。实参与形参间参数的传递是单向的“值传此时,被调函数的形参得到的是实参的指针,因此,该形参变量就指向实参,在被调函数中对形参的操作就相。指针与函【例】交换两个变量的值usingnamespacestd;voidswap(int*p1int*p2形参p1和p2定义成指针变量{intp; *p2=p;}voidmain(void) {inta,b; swap(&a,&b);//以变量a和变量b的地址作为}//Demos:参数传递方式.cpp) 指针作为函数的参数应该注意的问题函数的指

指针与函一个函数在内存中的起始地址就是该函数的指针。在C++中,函数指向函数的指针变量的一般定义形式为数据类型(*指针变量名)(参数类型1,参数类型2,…,参数型n类型名(*数组名[数组下标])(函数参数类型1,…,函数参数类型n);如:int(*pfA[5])(int,int);int(*pfA[5])(int,int)指针与函求a和b中较大者。#include"iostream"usingnamespacestd;intmax(intxint 被调函数voidmain(void)int }intmax(intx,inty){return(x>y?x:y);}指针与函 main(void){int(*p)(int,int);//定义了一个指向返回值为int型,带两int 将函数max的首地址() //orc=p(a,b);}说明

指针与函int(*p)(int,int)说明了一个指向返回值为整型,带两个p=max表示把函数 地址赋给指针变量p,那*pmax.c=(*p)(a,b);c=p(a,b);注意

指针与函函数的调用可以通过函数名调用,也可通过函数指针int(*p)(int,int);只是表示定义了一个指向函数的指数:如:p=max;因为只是传递函数的地址。指针与函把指向函数的指针变量作函数函数的指针变量主要的用途就是把指针作为参数传递指针与函返回指针值的函类型标识符号*函数名(参数名如:int*fun(intx,intyreturn(指针值//例返回指针1.cpp返回指针指针与函定义findmax()函数,其功能是寻找数组中的最大#include"iostream.h"usingnamespaceint*findmax(int*array,intsize,int*index);voidmain(void){inta[]={33,91,54,67,82,37,85,63,19,68},*maxaddr,idx}指针与函int*findmax(int*array,intsize,int*index){intmax,i;max=*(array+0);//array[0];for(i=1;i<size;i++)if(max<*(array+i)){}}第5针指针的概 指针与数

指针与数数组元素的指针是数组中某一元素所 元的地数组元素时是利用数组的下标进行的,也利用指针某一数组元素时,即可以先使一指针变量指向某一数组元素,然后通过该指针变指针与数指向数组元素的指针变量的定义与赋指向数组元素的指针变量的定义与以前定义指如intint//把数组元素a[0]的地址赋给指针变量p指针与数+语言中规定:数组名就代表数组首地址。也就是数组第0inta[10];int*p; /*与p=a;是等价的p=&a[0];与p=a;是等价但要注意,其作用是把数组的起始地址赋给指针,。指针与数通过指针变量使用数组元假设p为指向某一数组元素的指针变量。++语言规定:+1指向数组的下一个元素。(注意不是单纯的加1)。设定义了一个数组a[10],p的初值为&a[0],即此时pp+1或a+1就是a[1]元素的地址,即它们都指向数组的第1号元素a[1]。所以*(p+1)或//指针变量的下标元素指针与数p+i或a+i就是a[i]元素的地址,即它们都指向数组的第i号元素a[i]。所以*(p+i)或*(a+i)就与a[i]是等价的因此,利用此方法就可到数组元素。如:usingnamespacestd;voidmain(void){inta[10],*p,i; forcout<<*(p+i);//等价于cout<<a[i];或 指针与数对以上讲过的内容再作几点补充说明初值a.即p=a;,则:(2)*p++的运算,*p++等同于*(p++),它的作用是如: *(p*(++p)*(p++)是先取p的值作*运算,然后再使p加1(即指向*(++p)是先使p加1(即使p指向下一个元素),然后再指针与数(*p)++表示p所指的元素值加1,对上例来说只有指向数组元素的指针变量才可进行自加或自减运指针与数组及自增运算符二维数组中的最大最小元素及位置二维数组与指针的关系指针与数数组名作函数参数组名可以用来作为实参和形参。用数组名作实参指针与数【例】函数func是实现数组排序的过程。主函数将8个整#include<iostream>usingnamespacestd;voidfunc(int voidmain(void)intdata[8],

指针与数for(i=0;i<8;i++)cout<<"\n";for(i=0;i<8;i++cout<<data[i]<<",";cout<<endl<<endl;}指针与数voidfunc(int*s)//{inti,j;intwork;for(i=0;i<8;i++for(j=i+1;j<8;j++if(*(s+i)<*(s+j)){ *(s+j)=}第5针指针的概 指针与字符

指针与字符如:voidmain(void){char*string=”clanguage”;cout<<string;//or:cout<<&string[0];}输出结果:c指针与字符的内容。因为C格式的字符串是通过字符的指针定义的//指针的大小//指针的兼容性指针与字符实 形数组 数组 字符指针变字符指针变 字符指针变字符指针变 【例】将字符串 指针与字符usingnamespacestd;voidcopy_string(char*to,char*from){ }voidchara[20]=“clanguage”,b[20]="verygood"; }指针数组和指向指针的指指针数组和指向指针的指针指针数如果一个数组中的元素均为指针类型的数据,则称这个数组为类型标识 *数组名[数组长度如:int*p[4;//注意:int*p)[4p为一个指向具有4//整型元素的一维数组的指(例指向一维数组的指针.cpp char*name[3]={“fortran”,”basic”(例指针数组例指针数组和指向指针的指指向指针的指针前面已经介绍过指针数组。如 char说明该数组中的元素都是指针,数组代表了该指针数组的起始地址,e是指向指针型数据的指针。类型标识符号**变量名如:char**p相当于*(*p),说明指针变量p是指向一个字指针数组和指向指针的指指针数组例指针与数组及字符串的关系指向指针的指针示例第5针指针的概 命令行参main()的变元argc和argv(命令行参数通过命令行向主函数main()传递信息。命令行变元(commandlineargument)例如,在UNIX系统下编译C程序时,在提示符下键入其中,program_name是准备被编译的程序。程序名字program_name作为参数传给命令cc(编译程序命令行参类似地,C++的源程序经编译、 后生成了执行的程序(如:mprogram.ee)后,允许向该程序传送参D:\ms\program para1 para2 …paraNmain(intargc,char*argv[]))函数中的两个参数用于接受运行程序时命令行传入的参数信息,命令行参一个指针)都分别指向相应的一个命令行变元(如:D:\>myprogrampara1para2argc4argv[0]myprogram(即程序名),指针argv[1]指向命令行参数para1,指针argv[2]指向命令行参数para2,指针第5针指针的概 动 分堆内存的分配和释堆内存就是在程序的运行过程中根据需要而动态分配的一块内存,因此这种内存分配方式是动态分配,而不是静态分配(如:数组)。申请分配内存的方从内存中申请分配内存的方法有以下两种void*malloc(字节数动 分该函数如分配内存成功,则返回其起始地址,否则返回#include<cstdlib>or intp=(int*)malloc(sizeof(int));student*ps;ps=(student动 分利用new运算符格式1:指针变量名=new类型标识符格式2:指针变量名=new类型标识符(初始值格式3:指针变量名=new类型标识符[内存单元个数功能:13可动态数组。动 分int*p,*q;studentp=new p=new q=new //申请分配100个int类型的内存空间r=new 动 分两种方法的区别使用mallc函数分配内存时,其返回值要经过类型转换后才可赋给一个指针变量,而利用new分不需要类型转换。sizeof面试题动 分释放内存的方在+语言中,当不再使用动态分配的内存空间时,可以将这部分内存释放,以方便其他程序代码使用。free(起始内存地址利用delete运算符格式1:delete指针变量名;格式2:delete指针变量名;动 分#include<iostream>usingnamespacestd;void intnumber=newint[100];//申请分配100个int类型所占内存空间p=newint;//申请分配一个int类型所占内存空间(4个字节)q=(int*)malloc(10*sizeof(int));//申请分配10个int//if(number==NULL||p==NULL|| 动 分delete[]number释放number所指向的所有//存空deletep;//释放p所指向的所有内存空间free //释放q所指向的所有内存空}和+.c.c动态配置二维整型数组Josephus问题的结构(指针)解决动 分使用动 分配时应注意一是要确认分配成功后才能使用,否则可能造成严重的 ;二是在分配成功后不宜变动〈指针〉的值,否则在释放这片 时会引起系统内存管理 ;三是动态分配的 不会自动释放,只能通过delete释放。因此要注意适时释放动态分配的存//动态二维数组的产生与使用//动态三维数组的产生与使用第5针指针的概 的概念 和使 方 类型标识符& 如:inta;int&ra=a;//定义 时,必须同时对其进行初始化 个 示该 名是目标变量名一个名,系统并不给引用分配 单元。的使 【例 的定义及使用方法#include<iostream>usingnamespacestd;voidmain(void){intint //变量a cout<<&ra<<endl;//等价于cout<<&a<<endl; cout<<&ra<<endl;//等价于cout<<&a<<endl;} 类型标识符 名=指针变量名如:#include<iostream>usingnamespacestd;voidmain(void){int //定义指针变量int //定 //a int } 如:inta[10];int&ra[10]=a;//error 的指针。int int&int&&rb=ra;//error:referencetoreferenceisillegalint&*p=&ra; 不能建立空指针 ,如:不能建int 立void&ra=3;因为尽管在C++语言中有void数据如:int&ra=int; 作为函数的参作为函数的参 voidswap(int&p1int&p2此处函数的形参p1p2{intp;}void intcin>>a>>b;//输入a,bswap(a,b);//直接以变量a和b作为实参调用swap函数cout<<a<<’<<b;//输出结果} 出结果为2010。 使用传递函数的参数,在内存中并没有产生实参的副本一般变量传递函数的参数,当发生函数调用时,需要给形参分配单元,这样形参与形参就占用不同的单元,所以形参变量的值是实参变量的副本。因此,当参数传递的数据量较大时,用比用一般变量传递参数的效率和所占空间。 要重复使用“*这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。voidswap(int*p1,int*p2){intp;p=*p1必须用“*}voidmain(void) inta,b; //必须以变量a和b的地址作为实参}//指针 如何使一个被调函数同时返回多个 【例】使用 #include<iostream>usingnamespacestd;voidmax_min(int*p,intn,int&max,int&min);// void{inta[10],ma,mi,i; //调用函数}voidmax_min(int*p,intn,int&max,int&min)//形参max和minint for(i=1;i<n;i++){}} 返回函数 类型标识符&函数名(形参列表及类型说明){函数体说明 【例】以下程序中定义了一个普通的函数fn1(它用返回值的方法返回函数值),另外一个函数f#include<iostream>usingnamespacestd;float //定义全局变量floatfn1(floatr); float&fn2(floatr); floatfn1(floatr) //定义函数fn1,它以返回值的方//返回函returntemp;}float&fn2(floatr) 方式返回函数returntemp;}voidmain(void)floata=fn1(10.0);//第1float //第2种情况,可能会出错(不//不能从被调函数中返回一个临时变量或局部变量//(值方式返回 temp的值给临时变量,返回到//函数后 b以该临时变量初始化,使得b成为临//变量的别名。可这//in

温馨提示

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

评论

0/150

提交评论