清华大学C++课程第11讲指针(下)_第1页
清华大学C++课程第11讲指针(下)_第2页
清华大学C++课程第11讲指针(下)_第3页
清华大学C++课程第11讲指针(下)_第4页
清华大学C++课程第11讲指针(下)_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

清华大学C++课程第11讲指针(下)§11.1二维数组的指针二维数组的指针类型a代表整个二维数组的首地址a也是第1行的地址,a+i表示第i行元素的首地址,a+i=&a[i]&a[0][0]代表第一个元素的首地址,a[i][j]是第i行、j列元素地址staticinta[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};§11.1二维数组的指针行首址如果将a看作由a[0]、a[1]、a[2]组成的一维数组,则有a+i=&a[i],a[i]=*(a+i);a[i]看作a[i][0],a[i][1],a[i][2]组成的一维数组,则有a[i]=&a[i][0];§11.1二维数组的指针元素地址的表示

根据一维数组的表示方法,有:

(1)a[i]=&a[i][0];a[0]+i:表示一维数组中第i个元素地址,即:a[0]+1=&a[0][1];a[0]+2=&a[0][2];a[1]+1=&a[1][1];a[i]+j=&a[i][j]。

(2)&a[i][j]=*(a+i)+j;(3)a[i][j]=*(a[i]+j)=*(*(a+i)+j)§11.1二维数组的指针已知二维数组的元素指针后,可以用*运算符访问该元素。例:a[1][2]=13*(a[1]+2)=13*(*(a+1)+2)=13

以上是否有区别?§11.1二维数组的指针变量指向元素的指针变量:指向数组元素的指针变量和一般普通指针变量相同;提问:比较直接用二维数组下标访问元素有什么不同?§11.1二维数组的指针变量main(){staticinta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};inti,j;for(i=0;i<3;i++){for(j=0;j<4;j++)printf("%4d",a[i][j]);printf("\n");}}§11.1二维数组的指针变量上例中p=a[0]改为p=a;行么?a[0]+12和a+12区别?§11.1二维数组的指针变量指向数组行的指针变量:用来指向数组的每一行;定义形式: 类型标示符(*变量名)[列长]例如:inta[4][3];int(*p)[3];

p=a;

提问:p+2表示是什么意义?而*(*(p+i)+j)表示是什么意义?【例】用指向数组的行指针变量输出二维数组的任意一个元素§11.1二维数组的指针变量§11.2字符串指针变量字符串的存储形式有两种方式存储字符串:字符数组、字符指针变量main(){char*string="IloveChina!";

printf("%s\n",string);}注意:char*string="IloveChina!";等价于

char*string;

string="IloveChina!";§11.2字符的指针变量[例]将字符串a复制到字符串b。(用指针处理)§11.2字符的指针变量

字符数组字符指针变量组成:由若干元素组成,每个元素放一个字符。存放字符串首地址。初值方式:staticcharstr[]={"IloveChina!"};char*a="IloveChina!";赋值方式:charstr[14];char*a;str=“IloveChina!”;(错误)a="IloveChina!";占用内存:字符数组一个元素占一字节内存,且在编译时分配。

而指针变量中只可以放一个地址值(近指针=2字节,远指针=4字节)。且编译时未指定。

charstr[10];scanf("%s",str);

而:char*a;

scanf(“%s”,a);a尚未指向任何变量,因此编译通不过。字符数组和字符指针的比较§11.3指针数组指针数组概念:指针数组是一个数组,该数组中的每一个元素是指针变量形式:类型标识符*数组名[数组元素个数]例:int*p[4],*name[5];

定义一个指针数组,数组名p,有4个元素,每一个元素是指向整型变量的指针§11.3指针数组处理多个字符串:字符串本身是一维数组,多个字符串可以用二维数组来处理,但会浪费许多内存。用指针数组处理多个字符串,不会浪费内存。§11.3指针数组[例]将若干字符串按字母顺序(由小到大)输出。§11.3指针数组§11.4指向指针变量的指针变量§11.4指向指针变量的指针变量定义举例:

char**p;

p=name+2;§11.4指向指针变量的指针变量§11.5指向指针变量的指针变量main()函数的参数运行程序的命令行中,可以包含参数,例、命令名参数1参数2

.....参数n

例如,“命令名”是可执行文件file1.exe,执行该命令时包含两个字符串参数:

file1ChinaBeijing在源程序file1.c中,用main()函数的参数来表示命令的参数,main(intargc,char*argv[])

其中,argc表示命令行参数的个数(包括命令名),指针数组argv用于存放参数(包括命令名)上例中:argc=3;argv[0]="file1.exe",argv[1]="China",argv[2]="Beijing"§11.5指向指针变量的指针变量§11.6函数指针一个函数在编译时被分配一个入口地址(第一条指令的地址),这个入口地址称为函数的指针。如果一个指针变量的值等于函数的入口地址,称为指向函数的指针变量函数的指针变量:指向函数的入口地址的变量。用函数指针变量调用函数

C++语言中的指针变量,既可以指向变量(整型、字符型、实型、数组等),也可以指向程序的代码(如函数)可以通过函数指针变量来调用函数§11.6函数指针函数指针变量定义形式:函数返回值类型(*指针变量名)(形参类型)即:除函数名用(*指针变量名)代替外,函数指针的定义形式与函数的原型相同。(在函数指针定义中加入形参类型是现代程序设计风格)。例:int(*p)(int,int);

仅当形参类型是int时,可以省略形参类型,一般不要省略。int(*p)();语句p=max,把函数max的入口地址赋给函数指针变量p,因此,c=(*p)(a,b)中,*p就是调用函数max§11.6函数指针注意:指向函数的指针变量p,象p++、p--、p+n等运算是无意义的。§11.6函数指针函数指针变量作函数的参数:用函数指针作某函数的参数时,可以实现将函数指针变量所指向的函数入口地址传递给该函数,从而来实现统一的调用语句来调用不同的函数[例]设一个函数process,在调用它的时候,每次实现不同的功能。输入a和b两个数,第一次调用时找出a和b中大者,第二次调用时找出a和b中小者,第三次调用时求a与b之和分析:将求大值、求小值、求和值分别设计为函数max、min、add。process使用指针调用这些函数§11.6函数指针intmax(intx,inty);/*求大值*/intmin(intx,inty);/*求小值*/intadd(intx,inty);/*求和值*/voidprocess(intx,inty,int(*fun)(int,int));voidmain()

{inta,b;

printf("enteraandb:");

scanf("%d,%d",&a,&b);

printf("max=");

process(a,b,max);

printf("min=");

process(a,b,min);

printf("sum=");

process(a,b,add);

}intmax(intx,inty)

{intz;

if(x>y)z=x;

elsez=y;

returnz;}intmin(intx,inty)

{intz;

if(x<y)z=x;elsez=y;

returnz;}intadd(intx,inty)

{intz;

z=x+y;

returnz;}voidprocess(intx,inty,int(*fun)(int,int))

{intresult;

result=(*fun)(x,y);

printf("%d\n",result);}§11.6函数指针[例]:求定积分分析:编写一个求定积分的通用函数:floatintegral(float(*fun)(float),floata,floatb);其中,a、b表示积分区间,fun是函数指针。§11.6函数指针函数f在区间[a,b]的定积分公式:§11.6函数指针floatf1(floatx){floatf;f=1+x*x;returnf;}floatf2(floatx){floatf;f=1+x+x*x+x*x*x;returnf;}floatf3(floatx){floatf;f=x/(1+x*x);returnf;}floatintegral(float(*fun)(float),floata,floatb){floats,h,y;intn,i;s=((*fun)(a)+(*fun)(b))/2.0;n=100;h=(b-a)/n;for(i=1;i<n;i++)s=s+(*fun)(a+i*h);y=s*h;returny;}

voidmain(){floaty1,y2,y3;y1=integral(f1,0.0,1.0);y2=integral(f2,0.0,2.0);y3=integral(f3,0.0,3.5);printf("y1=%6.2f\ny2=%6.2f\ny3=%6.2f\n",y1,y2,y3);}§11.7返回指针的函数前面介绍了return语句只能返回一个值,如何返回多个数据?通过返回指针来实现返回指针函数定义形式:类型标识符*函数名(参数表)例、int*a(intx,inty);

声明一个函数,函数名为a,其返回值类型是“指向整型的指针”,函数形式参数为intx和inty例.有若干学生的成绩(每个学生四门课程),要求用户在输入学生序号(从0开始)后,能输出该学生的全部成绩分析:设计一个指针变量pointer指向一个学生的四门成绩,float(*pointer)[4];§11.7返回指针的函数float*search(float(*pointer)[4],intn);voidmain()

{staticfloatscore[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};

float*p;

inti,m;

printf("enterthenumberofstudent:");

scanf("%d",&m);

printf("ThescoresofNo.%dare:\n",m);

p=search(score,m);for(i=0;i<4;i++)

printf("%5.2f\t",*(p+i));}float*search(float(*pointer)[4],intn){float*pt;/*pt是指向实数指针变量,pointer是指向数组指针*/

pt=*(pointer+n);/*pt=(float*)(pointer+n)*/

returnpt;}§11.8指针变量使用小结有关指针变量的类型

定义含义

inti;定义整型变量iint*p;p是指向整型数据的指针变量

inta[n];定义数组a,元素类型为int,元素个数是nint*p[n];p是指针数组,包含n个指针变量,每一个指针变量可以指向整型数据

int(*p)[n];p是指向数组的行指针,数组有n个整型数

intf();f是函数,返回值是intint*p();p是函数,返回值是指针,该指针指向整型数据

int(*p)();p是函数指针变量,可以指向返回int数据类型的函数的入口地址。

int**p;p是指针变量,指向一个指向整型数据的指针§11.8指针变量使用小结指针变量运算小结1、指针变量加/减运算p++、p--、p+i、p-i、p+=i、p-=i加1表示指向下一个数据。§11.8指针变量使用小结2、指针变量赋值

p=&a;变量a的地址赋给p,即指针p指向a

p=array;数组array首地址赋给p

p=&array[i];数组元素

温馨提示

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

评论

0/150

提交评论