第8章 指针类型_第1页
第8章 指针类型_第2页
第8章 指针类型_第3页
第8章 指针类型_第4页
第8章 指针类型_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

第8章指针类型8.1概述8.2指针变量8.3指针和函数8.4指向函数的指针变量8.1概述地址为了方便对内存的访问,每一个内存单元都有一个编号,这个编号就是内存的地址。C程序中的每一个变量,C程序的每一个函数,在内存中都会对应一定的内存单元。C程序中的每一个函数经过编译后,生成的目标代码在内存中是连续存放的,函数目标代码的起始地址称作函数的首地址,也叫入口地址。在C语言中,函数名本身就代表着函数的入口地址。8.1概述指针指针在计算机中,对一个内存单元的访问是通过地址来实现的,地址“指向”需要操作的内存单元。因此在C语言中,把地址形象地称为指针。C语言中定义的变量在内存中都对应一定的内存单元,也就对应一个地址。变量对应的地址称作变量的指针。所谓函数的指针就是函数的入口地址。指针变量用来存放指针数据的变量叫作指针变量。既可以定义一个指针变量用来存放变量的地址,也可以定义一个指针变量用来存放函数的入口地址。用来存放变量地址的指针变量称作指向变量的指针变量,简称指针变量;用来存放函数入口地址的指针变量称作指向函数的指针变量。8.1概述有了指向变量的指针变量的概念,对变量的访问就可以间接进行。直接访问:利用变量名a将86送入存储单元。

a=86间接访问:利用指针变量pointer访问变量a。pointer=&a/*变量a的地址送指针变量pointer*/*pointer=86/*将86送入存储单元*/8.2指针变量

指针变量的定义指针变量定义的形式为:

基类型*指针变量名 这里“基类型”表示指针变量所指向的变量的类型,“*”表示定义的是指针变量。例如: int*pointer;float*p1,*p2;8.2指针变量指针变量的使用指针变量的赋值可以给指针变量赋地址值,且地址值必须是基类型变量的。为此C语言提供了取地址运算符&,它的作用是取得变量所占用的存储单元的首地址。例如,语句“inta,*pointer;”之后,可以有语句:

pointer=&a;可以在定义指针变量的同时对其初始化,例如:inta; int*pointer=&a;可以给指针变量赋空值NULL。例如:

p=NULL;通过指针访问变量8.2指针变量

【例8.1】通过指针变量访问变量。main(){intx;

/*整型变量x*/floaty;

/*实型变量y*/int*px=&x;/*指向整型变量的指针变量px,并指向x*/float*py=&y;/*指向实型变量的指针变量py,并指向y*/*px=20;/*通过指针变量px给变量x赋值*/*py=19.600;/*通过指针变量py给变量y赋值*/*px=*px/2;/*通过指针变量px访问变量x*/y=y+10;

printf("*px=%d,*py=%6.3f\n",*px,*py);

printf("x=%d,y=%6.3f\n",x,y);}程序的执行结果为:*px=10,*py=29.600x=10,y=29.6008.2指针变量

【例8.2】输入x和y,求两个数的和。请注意分别使用x、y和px、py的异同。main(){intx,y;

int*px=&x,*py=&y;

printf("usingx,y:\nenterx,y:");

scanf("%d%d",&x,&y);

printf("x=%d,y=%d,x+y=%d\n",x,y,x+y);

printf("*px=%d,*py=%d,*px+*py=%d\n",*px,*py,*px+*py);

printf("usingpx,py:\nenterx,y:");

scanf("%d,%d",px,py); /*通过指针输入x,y*/

printf("x=%d,y=%d,x+y=%d\n",x,y,x+y);

printf("*px=%d,*py=%d,*px+*py=%d\n",*px,*py,*px+*py);}8.2指针变量在两次均输入3、5,则程序的运行结果为:usingx,y:enterx,y:35x=3,y=5,x+y=8*px=3,*py=5,*px+*py=8usingpx,py:enterx,y:35x=3,y=5,x+y=8*px=3,*py=5,*px+*py=88.2指针变量【例8.3】注意&运算符和*运算符混合使用的情况。main(){intx=3,y=4,z,*px,*py;z=*&x;

px=&x;

py=&y;

py=&*px;

printf("x=%d,y=%d,z=%d\n",x,y,z);

printf("*px=%d,*py=%d\n",*px,*py);}程序的执行结果为:x=3,y=4,z=3*px=3,*py=38.2指针变量

【例8.4】输入a和b两个整数,按先大后小顺序输出。main(){inta=5,b=9,temp;if(a<b){temp=a;a=b;b=temp;}

printf("\na=%d,b=%d",a,b);}程序运行结果如下:a=9,b=58.2指针变量【例8.5】重新编写例8.4。main(){inta=5,b=9;

int*pa=&a,*pb=&b,*p;if(a<b){p=pa;pa=pb;pb=p;}

printf("\na=%d,b=%d",a,b);

printf("\nmax=%d,min=%d",*pa,*pb);}程序运行结果如下:a=5,b=9max=9,min=58.2指针变量

8.3指针和函数

指针变量作函数参数地址传递方式其实也是值传递方式,但它是一种特殊的值传递方式,它传递的不是普通的数值,而是地址。在函数调用时,首先由实参向形参赋值,这时形参和实参的值是相同的,即实参和形参指示了相同的地址单元;所以在函数调用过程中,改变形参(地址值)所指示的单元的内容,也就相当于改变了实参所指示单元的内容,这正是地址传递方式的特点。8.3指针和函数【例8.6】交换a、b的值,然后输出。swap(int*p1,int*p2){inttemp;temp=*p1;*p1=*p2;*p2=temp;}main(){inta=5,b=9;

int*pa=&a,*pb=&b;swap(pa,pb);

printf("na=%d,b=%d",,a,b);}8.3指针和函数

程序运行结果如下:a=9,b=58.3指针和函数

【例8.7】求两个数的和、差、积、商。voidf1(intx,inty,int*p1,int*p2,int*p3,int*p4){*p1=x+y;*p2=x-y;*p3=x*y;*p4=x/y;}main(){intx,y,a,b,c,d;

printf("\npleaseenterxy:");/*输出信息提示输入两个整数*/

scanf("%d%d",&x,&y);f1(x,y,&a,&b,&c,&d);

printf("x+y=%d\n”,a);

printf("x-y=%d\n”,b);8.3指针和函数

printf("x*y=%d\n”,c);printf("x/y=%d\n”,d);}pleaseenterxy:63↙x+y=9x-y=3x*y=18x/y=28.3指针和函数

函数返回地址值一个函数不仅可以返回整型、实型、字符型等数据,也可以返回指针类型的数据,即地址值。当一个函数返回指针类型数据时,应当在定义函数时对返回值的类型进行说明。说明的格式为: 基类型*函数名(形式参数表)8.3指针和函数【例8.8】输入a,b,c三个数,调用函数func,得到其中最大数的地址。int*func(int*x,int*y,int*z);/*函数声明*/main(){inta,b,c,*p;

printf("\nPleaseentera,b,c:\n");

scanf("%d%d%d",&a,&b,&c);p=func(&a,&b,&c);printf("a=%d,b=%d,c=%d,*p=%d\n",a,b,c,*p);}int*func(int*x,int*y,int*z)/*返回地址值的函数*/{if(*x>=*y&&*x>=*z)return(x);if(*y>=*x&&*y>=*z)return(y);return(z);}8.3指针和函数

在输入23、44、59时,程序运行结果为:Pleaseentera,b,c:234459↙a=23,b=44,c=59,*p=598.4指向函数的指针变量指向函数的指针变量的定义指向函数的指针变量定义方式如下:类型说明符(*指针变量名)();类型说明符指函数返回值的类型,

int(*fp)();注意:在定义指向函数的指针变量时,用于括起变量的圆括号不能省略。试比较下面两种定义的不同含义:

int(*fp)(); /*定义了一个指向函数的指针变量*/

int*fp(); /*定义了一个返回值是指针的函数*/8.4指向函数的指针变量用指向函数的指针变量调用函数定义了指向函数的指针变量后,就可以通过它来间接调用所指向的函数。将函数的入口地址(函数名)赋给指向函数的指针变量;将指向函数的指针变量(连同圆括号)代替函数名使用。【例8.9】编写函数main,完成“输入n(n<10)个整数,找出其中最大数”的功能。max(intn){inti,x,maxinum;scanf("%d",&maxinum);

8.4指向函数的指针变量for(i=1;i<n;i++){scanf("%d",&x);if(maxinum<x)maxinum=x;

}return(maxinum); }main(){int(*p)();/*定义指向函数的指针变量*/

intm,n;

p=max; /*p指向函数maxn*/

scanf("%d",&n);

m=(*p)(n); /*通过指针变量调用函数*/

printf("n=%d,Themaxoneis%d\n",n,m);}8.4指向函数的指针变量指向函数的指针变量主要应用在两种情况:利用指针进行函数的选择调用:根据不同的条件,将不同的函数首地址赋给函数指针变量,然后通过函数指针变量来间接地调用该函数,从而达到根据不同条件调用不同函数的目的。【例8.10】已知契比雪夫多项式的定义如下:

x (n=1) 2x2-1 (n=2) 4x3-3x (n=3) 8x4-8x2+1 (n=4)

编写程序,从键盘输入整数n和实数x,根据n的值调用不同函数,计算多项式的值。8.4指向函数的指针变量

main()

{floatfn1(float),fn2(float),fn3(float),fn4(float);/*函数声明*/

float(*p)(float); /*定义函数指针变量*/

floatx,result;intn;do{printf("Enterxandn:\n");scanf("%f,%d",&x,&n);}while(n<1||n>4);switch(n){case1:p=fn1;break;case2:p=fn2;break;case3:p=fn3;break;case4:p=fn4;break;/*函数首地址赋给函数指针变量*/}8.4指向函数的指针变量result=(*p)(x);/*通过函数指针变量调用函数*/printf("result=%f",result);}floatfn1(floatz){printf("z=%f",z);return(z);}floatfn2(floatx){floaty;y=2*x*x-1;return(y);}floatfn3(floatx){floaty;y=4*x*x*x-3*x;return(y);}8.4指向函数的指针变量floatfn4(floatx){floaty;y=8*x*x*x*x-8*x*x+1;return(y);}指向函数的指针变量作函数参数:用指向函数的指针变量作函数参数,可以把相应函数的入口地址传送给一个函数(不妨设函数fa),在函数fa中就可以利用通过参数传来的指针变量调用相应的函数。8.4指向函数的指针变量【例8.11】编写程序,从键盘输入整数n和实数x,计算契比雪夫多项式的值。要求利用指向函数的指针变量作函数参数来实现。

floatfresu(floatx,float(*pt)(float))/*函数指针变量作形参*/ {fl

温馨提示

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

评论

0/150

提交评论