您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > C++课件(南航皮德常)5
1第5章指针皮德常nuaacs@126.com25.1指针的概念例如,假设定义有如下2个变量:intnum=123;charch=’A’;35.2指针变量•存放指针或者说地址的变量就是指针变量。•一般变量的内存单元中存放的是数据,指针变量的内存单元中存放的是地址。45.2.1定义指针变量•例如:int*pInt;char*pChar;1:指针不指向内存的0号单元。如果指针变量值为0(即NULL),表示空指针。2.地址值与整型数值不同。如地址1000与整数1000。3.无论是何种类型的指针都占4个字节的内存空间。例如:int*pInt;char*pChar;double*pDouble;float*pFloat;coutsizeof(pInt)\tsizeof(pChar)\tsizeof(pDouble)\t“sizeof(pFloat);65.2.2运算符&和*1.&:取内存变量地址,例如:char*pChar,ch='A';pChar=&ch;75.2.2运算符&和*2.*:通过指针间接访问所指变量char*pChar,ch1='A',ch2;pChar=&ch1;ch2=*pChar;*pChar='B';指针变量初始化:charch=‘A’,*pChar=&ch,*p=NULL;本节教材上给出的思考。85.2.3引用指针变量•例如:1intx=30,y=90;2int*p1=&x,*p2=&y,*t;3t=p1;p1=p2;p2=t;问:*p1、*p2、x和y的值?如下形式又是多少?1intx=30,y=90;2int*p1=&x,*p2=&y,t;3t=*p1;*p1=*p2;*p2=t;95.3指针与数组•访问数组的方式:下标形式、指针形式。•数组要么在静态存储区中被创建,如全局数组和静态数组;要么在栈上被创建,如一般的局部数组。•数组名对应着一块内存,其地址与容量在其生命期内保持不变,只有数组的内容可以改变。•指针可以指向任意类型的内存块,它的特征是“可变”。指针比数组灵活,但也更容易出错。105.3.1指向数组元素的指针•数组名代表该数组的开始地址,这意味着数组名是一个指针常量,例如:inta[10];inta[10],*p;p=&a[0];则p、a、&a[0]是一个值。115.3.1指向数组元素的指针•思考:下面的程序涉及指针与数组,有什么错?charstr[]=hello;str[0]='X';coutstrendl;char*p=world;p[0]='X';//编译器查不出该错误coutpendl;125.3.2指针的运算1.指针±整数值例:inta[10],*p1,*p2;p1=&a[2];p2=p1+3;注意形式,易错:intm=*p1++,n=*++p2;【例5.1】通过指针使一个数组逆序存放。intset[8]={10,20,30,40,50,60,70,80};int*p1,*p2,t,i;p1=set;P2=set+7;for(i=0;i=3;i++){t=*p1;*p1=*p2;*p2=t;p1++;--p2;}思考如下程序段的输出结果:intset[8]={10,20,30,40,50,60,70,80},*p=&set[3];coutp[0]set[0]*(p+3)*(set+3);145.3.2指针的运算2.指针相减,例如:int*p1,*p2,n,a[]={2,4,6,8,10};p1=&a[1];p2=&a[4];n=p2–p1;n=p1–p2;•注意:inta[]={2,4,6,8,10},*p1=&a[0],*p2=&a[4],*p3;让p3指向数组中间的一个元素:p3=p1+(p2–p1)/2。155.3.2指针的运算3.指针比较:指向同一个数组的两个指针可进行的比较包括==、!=、、=、和=【例5.1】通过指针使一个数组逆序存放。intset[8]={10,20,30,40,50,60,70,80};int*p1,*p2,t,i;for(p1=set,p2=set+7;p1p2;i++){t=*p1;*p1=*p2;*p2=t;p1++;--p2;}165.3.3二维数组与指针•1.对数组的理解。行指针:如a和a+1元素指针:如*a和*(a+1)175.3.3二维数组与指针•2.二维数组元素a[i][j]的表示1.a[i][j]的地址可表示为:&a[i][j]、a[i]+j和*(a+i)+j。2.元素表示为:a[i][j]、*(a[i]+j)、*(*(a+i)+j)和(*(a+i))[j]例如:输出一个2×3二维数组的每个元素地址和元素值:inta[2][3]={10,20,30,40,50,60},*p;for(p=a[0];pa[0]+6;p++)coutsetw(5)psetw(5)*pendl;185.3.3二维数组与指针•3.行指针变量一维数组:intb[10],*pb=b;pb与b、*pb与*b、pb+1与b+1、*(pb+1)与*(b+1)分别等价。二维数组与行指针变量:inta[3][4],(*pa)[4]=a;(1)pa与a都是a[0]大元素的地址;(2)*pa与*a都是a[0],是a[0][0]元素的地址;(3)pa+1与a+1都是a[1]大元素的地址;(4)*(pa+1)与*(a+1)都是a[1],是a[1][0]元素的地址。19【例5.2】输出二维数组的地址。inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};couta\ta[0]\t*(a+0)\t&aendl;couta+1\ta[1]\t*(a+1)\t&a[1]endl;couta[1]+2\t*(a+1)+2\t&a[1][2]\tendl;5.3.3二维数组与指针20【例5.3】通过行指针变量访问二维数组元素。inta[3][3],(*p)[3];Intsum=0,i,j;srand(time(0));p=a;for(i=0;i3;i++){for(j=0;j3;j++){*(p[i]+j)=rand()%20;coutsetw(5)p[i][j];}coutendl;}for(i=0;i3;i++)sum+=*(*(p+i)+i)+*(*(p+i)+(2-i));5.3.3二维数组与指针21【例5.4】编写一个通用的二维数组输出函数。voidprint(int*p,introw,intcol){inti;for(i=0;irow*col;i++,p++){if(i%col==0)coutendl;coutsetw(4)*p;}coutendl;}5.3.3二维数组与指针225.4指针与函数C++中的函数参数的传递方式:(1)传值调用;(2)传引用。•另一种在函数中可以修改相应实参的方法,是通过指针传递(实际上是传递指针的值,属于传值调用)。23【5.4】交换变量x与y的值。采用基本类型的变量做函数形参。5.4指针与函数intmain(){intx=10,y=20;swap(x,y);coutx\tyendl;return0;}voidswap(inta,intb){intt;t=a;a=b;b=t;}24【5.5】交换变量x与y的值。采用引用做函数形参。intmain(){intx=10,y=20;swap(x,y);coutx\tyendl;return0;}voidswap(int&a,int&b){intt;t=a;a=b;b=t;}5.4指针与函数25【5.6】交换变量x与y的值。采用指针做函数形参。intmain(){intx=10,y=20;swap(&x,&y);coutx\tyendl;return0;}voidswap(int*px,int*py){intt;t=*px;*px=*py;*py=t;}5.4指针与函数【例5.6】将数组中从第i个开始的n个元素,反序存放在原数组中。voidreverseArray(intx[],intstart,intcount);intmain(){inti,a[10]={0,1,2,3,4,5,6,7,8,9};reverseArray(a,2,6);for(i=0;i10;i++)coutsetw(5)a[i];return0;}voidreverseArray(intx[],intstart,intcount){intt,i,j;for(i=start,j=start+count-1;ij;i++,j--){t=x[i];x[i]=x[j];x[j]=t;}}思考下面的问题输出结果:charstr[]=helloworld;char*ps=str;coutsizeof(str)endl;coutsizeof(ps)endl;voidfun(charstr[100]){coutsizeof(str)endl;}28函数可返回一个指针,但必须保证指针指向的对象存在。【例5.7】有3个学生,每人4门功课,输入一个学号,输出相应的成绩。float*search(float(*p)[4],intn){return*(p+n);}voidmain(){floatscore[][4]={{60,70,80,90},{67,78,89,98},{78,88,89,98}};float*p;inti,m;cinm;p=search(score,m);for(i=0;i4;i++)coutsetw(5)*(p+i);}29函数可返回一个指针,但必须保证指针指向的对象存在。分析如下函数存在的错误:char*getName(){charname[81];coutEnteryourname:;cin.getline(name,81);returnname;}30指向函数的指针例如:int(*funP)(int,int);容易搞混:int*funP(int,int);intmax(intx,inty){returnxy?x:y;}funP=max;调用函数max的方法:k=max(10,20);k=(*funP)(10,20);k=funP(10,20);31指向函数的指针【5.8】采用函数名做参数。intmax(int,int);intmin(int,int);intadd(int,int);intprocess(intx,inty,int(*fun)(int,int)){returnfun(x,y);}voidmain(){inta,b;cinab;coutprocess(a,b,max)endl;coutprocess(a,b,min)endl;coutprocess(a,b,add)endl;}325.5指针数组与指向指针的指针5.5.1指针数组例如:int*pInt[5];思考如下程序片段的含义:inta[6],*p[3],i;for(i=0;i6;++i)a[i]=i*3;for(i=0;i3;++i)p[i]=&a[i*2];for(i=0;i3;++i)coutsetw(5)*(p[i]+1);自学【例5.10】。335.5.2main函数的参数在main()函数头部声明的格式为:intmain(intargc,char*argv[])intmain(intargc,char**argv)argc表示命令行中字符串的个数。argv[]指向命令行中的各个字符串。34【例5.11】通过命令行参数计算输入数据的和。voidmain(intargc,char*argv[]){intsum,i;coutCommandnam
本文标题:C++课件(南航皮德常)5
链接地址:https://www.777doc.com/doc-4220318 .html