您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > C++程序设计教程(第八章)
1C++程序设计教程钱能8.指针8.1指针概念1.指针即为地址。2.定义指针变量int*p;//*称为指针定义符int*p,q;//定义了一个指针变量和整型变量3.建立指针inti;int*p=&i;int*p=0;4.间接引用指针inti;int*p=&I;*p=20;//*称为间接引用操作符2C++程序设计教程钱能5.指针变量的地址指针变量亦为变量,因而它也具有内存地址。注意:不论何种类型的指针,其在内存中占在的内存单元数是一致的。6.指针与整型数的区别指针变量中所存储的是地址值。intiCount=20;int*p=&iCount;*p=&iCount;//errorp=50;7.指针的初始化注意:指针变量在使用之前必须进行初始化!8.指针类型与实际存储的匹配给指针赋值必须是一个地址值,而且应是一个与该指针类型相符的变量或常量的地址。否则,应使用强制类型转换,但应该注意此操作可能引发的问题。例如:3C++程序设计教程钱能shorts=20;int*p;p=(int*)&s;cout*pendl;//此时输出的值并不是s的值8.2指针运算指针变量之间可以进行减法,其差值为两个内存地址的差值。例如:inti,j;int*p=&i,*q=j;coutp-qendl;指针变量可与整型数作加减运算。cout*(p++)endl;!不管是加法还是减法,必须保证其访问是有意义的4C++程序设计教程钱能8.3指针与数组1.指针与一维数组int*p,a[20];p=a+1;p[i],a[i]==*(a+i)2.指针与二维数组int*p,a[10][20];p=&a[0][0];p=a[0];p=*a;a[i][j],p[i][j],*(a[i]+j),*(p[i]+j),*(*(a+i)+j),*(*(p+i)+j)int(*p)[20];p=&a;区别行指针与列指针5C++程序设计教程钱能3.指针字符数组char*p=“computer”;chara[20]=“computer”;注意:数组名是指针常量,其值不能修改。8.4堆内存分配1.堆内存堆空间即为程序在运行时刻申请的内存空间,即动态分配的内存空间。而在编译时便确定其内存使用状况,如inti=20;此时编译器分配足够的内存空间用于存放一个整型数,称作静态分配。6C++程序设计教程钱能静态与动态内存分配的两个主要区别:①静态对象是有名字的变量,我们直接对其进行操作,而动态对象是没有名字的变量,我们通过指针间接地对它进行操作。②静态对象的分配与释放由编译器自动处理。程序员需要理解这一点,但不需要做任何事情。相反,动态对象的分配与释放,必须由程序员显式地管理,相对来说比较容易出错,它通过new和delete两个表达式来完成。2.获得与释放堆空间malloc()void*malloc(size_tsize)free()voidfree(void*)7C++程序设计教程钱能#includealloc.h#includeiostream.hvoidmian(){intarray_size;//数组长度int*array;//数组首地址cinarray_size;array=(int*)malloc(array_size*sizeof(int));//堆内存分配for(intcount=0;countarray_size;count++)array[count]=count*2;cout//……}free(array)8C++程序设计教程钱能3.new与deletenew与delete是C++中的操作符。new的操作数为数据类型,它可以带有初始化值表或单元个数,返回一个具有操作数之数据类型的指针。delete的操作数是new返回的指针,当返回的是new分配的数组时,应该带[];对象的动态分配可通过new的两个版本之一来完成。第一个版本用于分配特定类型的单个对象。例如:int*pint=newint(1024);分配了一个没有名字的int类型的对象对象初始值为1024。然后,表达式返回对象在内存中的地址。接着,这个地址被用来初始化指针对象pint。对于动态分配的内存惟一的访问方式是通过指针间接地访问。9C++程序设计教程钱能new表达式的第二个版本,用于分配特定类型和维数的数组。例如:int*pia=newint[4];分配了一个含有四个整数元素的数组。当用完了动态分配的对象或对象的数组时,我们必须显式地释放这些内存。我们可以通过使用delete两个版本之一来完成这件事情,而释放之后的内存则可以被程序重新使用。单一对象的delete表达式形式如下://删除单个对象deletepint;数组形式的delete表达式如下://删除一个对象数组delete[]pia;如果忘了删除动态分配的内存,程序就会在结束时出现内存泄漏(memoryleak)的问题。内存泄漏是指一块动态分配的内存,我们不再拥有指向这块内存的指针,因此我们没有办法将它返还给程序供以后重新使用。10C++程序设计教程钱能8.5const指针1.指向常量的指针(常量指针)在指针定义语句的类型前加const,表示指向的对象是常量。例如:constinta=78;constintb=28;intc=18;constint*pi=&a;*pi=58;//error*pi=&b;*pi=68;//errorpi=&c;*pi=88;//errorc=98;定义指向常量的指针只限制指针的间接访问操作,而不能规定指针指向的值本身的操作规定性。11C++程序设计教程钱能2.指针常量在指针定义语句的指针名前加const,表示指什本身是常量。例如:char*constpc=“asdf”;pc=“dfgh”;//error*pc=‘b’;*(pc+1)=‘c’;*pc++=‘y’;//errorpc为一常量constintb=28;int*constpi=&b;//error指针类型不一致注意:指针常量在定义的时候必须初始化。指针常量定义告诉编译器,该变量为常量,不能作为左值进行操作,但是允许修改间接访问值,即其所指向的存储单元可以修改。12C++程序设计教程钱能3.指向常量的指针常量(常量指针常量)constintci=7;intai;constint*constcpc=&ci;constint*constcpi=&ai;cpi=&ci;//error*cpi=39;//errorai=39;ci=35;注意:常量指针常量在定义的时候必须初始化。13C++程序设计教程钱能8.6指针与函数1.传递数组的指针的性质voidf(int*array,intn);voidf(intarray[],intn);注意:此时array均为指针,即在函数体内部可以修改其值.2.使用指针修改函数参数C语句中的函数调用的实参和形参之间只能按值传送。但可以通过将函数的参数声明为指针实现函数返回多个值。voidswap(int*x,int*y){intt;t=x;x=y;y=t;}14C++程序设计教程钱能3.指针函数返回指针的函数称为指针函数。指针函数不能把在它内部说明的具有局部作用域的数据地址为返回值。因为函数返回后,函数内定义的局部变量所占空间将会释放,并在程序的运行过程中进行再分配。但可以返回堆空间的地址、全局变量或静态变量的地址。示例4.void指针void是空类型指针,它不指向任何类型,即void指针只是一个地址,其不能提供类型信息,因而空类型指针不能进行指针运算,也不能进行间接引用。将其它任何类型的指针赋值给空类型指针都是合法的,反之则不允许,应该进行强制类型转换。inta=20;int*pt=&a;void*p=pr;//okpr=p;//errorpr=(int*)p;15C++程序设计教程钱能int*get_int(char*str){intvalue=20;coutstrendl;return&value;//warning}voidsome(char*str){inta=40;coutstrendl;}voidmian(){int*pr=get_int(“inputavalue”);cout*prendl;some(“itisuncertain”);cout*prendl;}16C++程序设计教程钱能8.7字符指针1.字符数组和字符串常量字符串常量:由引号标识,但不是用来初始化数组的字符串。字符串常量的类型是指向字符的指针(char*),字符串常量在内存中以’\0’结尾。2.字符串常量的格式和特点if(“hello”==“hello”)cout“ok”elsecout“no”;注意:两个字符串常量的比较是地址的比较。3.字符指针(字符串常量,字符数组名,字符指针都是同一种数据类型)4.字符串比较intstrcmp(constchar*str1,constchar*str2);17C++程序设计教程钱能5.字符串赋值charbuffer[10];char*point=“computer”;char*ptr;buffer=point;ptr=buffer;buffer=“computer”;point=“department”;strcpy(buffer,point);strcpy(ptr,point);char*strcpy(char*dest,constchar*src);void*memcpy(voiddest,void*src,size_tn);注意:strcpy仅能对以’\0’结束符的字符数组进行操作。18C++程序设计教程钱能8.8指针数组1.定义指针数组char*proname[]={“C”,”Ada”,”C++”};char*p[10]={NULL};inti=20,j=20;int*pi[10]={&i,&j};2.指针数组与二维数组intiArray[2][3];intiArray1[10];intiArray2[20];int*p[2];p[0]=iArray1;p[1]=iArray2;19C++程序设计教程钱能3.指向指针的指针intiVar;int=&iVar;int*=&p;int**=&pp;char*pc[]={“a”,”b”,”c”};char**ppc=pc;4.NULL指针值NULL是空指针,即不指向任何地方。20C++程序设计教程钱能8.9命令行参数C++程序是操作系统调用的函数。因而其有以下形式:voidmain();voidmain(intargc);voidmain(intargc,char*argv,char*env)voidmain(intargc,char*argv);注意事项:1.参数的取名是任意的,例如:voidmain(intcount,char*parameters);2.参数之间用空格隔开;3.argc表示的个数,argv表示参数数组,其中第一个参数为程序名。21C++程序设计教程钱能一个例子:prog-d-oofiledata0argc被设置为5,且argv被设置为下列C风格字符串:argv[0]=prog;argv[1]=-d;argv[2]=-o;argv[3]=ofile;argv[4]=data0;argv[0]总是被设置为当前正被调用的命令。从索引1到argc-1表示被传递给命令的实际选项。22C++程序设计教程钱能8.10函数指针1.定义函数指针int(*func)(chara,charb);int*func(chara,charb);2.函数指针的内在差别intfn1(charx,chary);int*fn2(charx,chary);intfn3(inta);int(*fp1)(chara,charb);int(*fp2)(inta);fp1=fn1;//okfp1=fn2;//error所指向的函数不一致fp2=fn3;//okfp2=fp1;//error所指向的函数不一致fp2
本文标题:C++程序设计教程(第八章)
链接地址:https://www.777doc.com/doc-3376729 .html