存储地址的变量的类型就是指针类型_第1页
存储地址的变量的类型就是指针类型_第2页
存储地址的变量的类型就是指针类型_第3页
存储地址的变量的类型就是指针类型_第4页
存储地址的变量的类型就是指针类型_第5页
已阅读5页,还剩50页未读, 继续免费阅读

下载本文档

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

文档简介

1、第第7 7章章 指针指针 存储地址的变量的类型就是指针类型存储地址的变量的类型就是指针类型 能直接对内存地址操作能直接对内存地址操作, 实现动态存储管理实现动态存储管理 容易产生副作用容易产生副作用, 初学者常会出错初学者常会出错 学习时应特别细心学习时应特别细心, 多动脑、多对比、多上机多动脑、多对比、多上机 7.1.1 变量的地址和变量的值变量的地址和变量的值内存编址内存编址:内存是连续的存储空间。内存是连续的存储空间。 对内存进行了编址对内存进行了编址内存编址是连续的内存编址是连续的, 它的基本单位为字节它的基本单位为字节内存分配:内存分配:系统根据类型为变量分配内存单元系统根据类型为变

2、量分配内存单元变量内存单元的起始地址即为变量的地址变量内存单元的起始地址即为变量的地址编译后编译后, 每个变量名对应一个地址每个变量名对应一个地址对变量的访问就是通过这个地址进行的对变量的访问就是通过这个地址进行的变量引用:变量引用:从变量名对应的地址开始的若干内存单元从变量名对应的地址开始的若干内存单元(字节数由定义字节数由定义类型确定类型确定)中取出数据中取出数据; 变量赋值:变量赋值:将数据按该变量定义的类型存入对应的内存单元中将数据按该变量定义的类型存入对应的内存单元中内存单元的内容就是变量的值。内存单元的内容就是变量的值。程序中: int i; float k; 内存中每个字节有一个

3、编号-地址.2000200120022005内存02003ik 编译或函数调用时为其分配内存单元变量是对程序中数据存储空间的抽象 #includevoid main() int* p; int a; p=&a; scanf(“%d”,&a); printf(“%d %d”,*p, a); scanf(“%d”, p); printf(“%d %d”,*p, a); *p=*p+2; printf(“%d %d”,*p, a); a=a+2; printf(“%d %d”,*p, a);.2000200420062005变量a10变量p200120022003指针:一个变量的地址

4、指针:一个变量的地址指针变量:专门存放变量地址的变量叫指针变量指针变量:专门存放变量地址的变量叫指针变量2000指针指针变量 变量的内容 变量的地址指针变量变量变量地址(指针)变量值指向地址存入指针变量整型变量定义格式: 基类型名 *指针变量名 =&变量名 char *p1; int *p2; float *p3; 指针变量赋值 char a,*pa; pa=&a; 指针变量的引用指针变量的引用 *pa=a;两个与指针有关的运算符 &:取地址运算符,取其右边变量的地址。 如: &a 取变量a的地址。 *:指向运算符(“间接访问”运算符) 访问右边指针变量所指向的

5、变量。 如:*p 是指针变量p所指向的变量。 &与*运算符 两者关系:互为逆运算 理解.2000200420062005整型变量i10变量i_pointer2001200220032000指针变量i_pointer-指针变量,它的内容是地址量*i_pointer-指针的目标变量,它的内容是数据&i_pointer-指针变量占用内存的地址200010i_pointer*i_pointer&i_pointerii_pointer = &i = &(*i_pointer)i = *i_pointer = *(&i)注意注意:(1) 指针变量定义和引用时

6、指针变量定义和引用时“*”含义有差别。含义有差别。 在引用中在引用中 “*”是是运算符运算符,。 表示指针变量指向的变量。表示指针变量指向的变量。 在指针变量定义时在指针变量定义时“*”理解为指针类型理解为指针类型定义符定义符 表示定义的变量是指针变量。表示定义的变量是指针变量。(2) 不能引用没有赋值的指针变量不能引用没有赋值的指针变量。(。(盲指针盲指针) (3) p=&a;是给指针变量是给指针变量p赋值赋值。 *p=3; 是给是给p指向的变量赋值。指向的变量赋值。 两者含义完全不同。两者含义完全不同。(4)必须用同类型的指针给指针变量赋值。必须用同类型的指针给指针变量赋值。 指针

7、变量只存放地址指针变量只存放地址。 不能直接用整型量不能直接用整型量(或非地址量或非地址量)赋值给指针变量。赋值给指针变量。 直接访问与间接访问直接访问与间接访问直接访问:按变量名存取变量值直接访问:按变量名存取变量值间接访问:通过存放变量地址的变量去访问变量间接访问:通过存放变量地址的变量去访问变量例 i=3; -直接访问指针变量.2000200420062005整型变量i10变量i_pointer20012002200320003例 *i_pointer=20; -间接访问20前提条件前提条件 i_pointer=&i;指针变量.2000200420062005整型变量i10变量i

8、_pointer2001200220032000整型变量k例 int k, i, i_pointer=&i; k=i; -直接访问 k=*i_pointer; -间接访问10例例 7.1 取地址运算符取地址运算符&和指向运算符和指向运算符*的应用。的应用。main() int m, n; int *p=&m,*q=&n; printf(Input m,n:); scanf(%d %d,p,&n); /* 指针变量指针变量p之前不加之前不加&,它与它与&m相同相同 */ printf(m=%d &m=%Xn,m,&m); p

9、rintf(*p=%d p=%Xn,*p,p); printf(n=%d &n=%Xn,n,&n); printf(*q=%d q=%Xn,*q,q);#includevoid swap(int *p1,int *p2);main() int x,y; printf(Input x,y: ); scanf(%d %d,&x, &y); if(xy) swap(&x, &y); printf(Sorted: %d %d n,x,y);void swap(int *p1,int *p2) int p; p=*p1; *p1=*p2; *p2=p;7.

10、2.3 函数中用指针变量作形参实现变量的引用传递7.3 7.3 指针与数组指针与数组 数组名代表该数组数组名代表该数组下标为下标为0的的元素地址(数组首地址)元素地址(数组首地址) 数组名与指针是相同的概念数组名与指针是相同的概念 数组名是指针类型的符号常量数组名是指针类型的符号常量7.3.1 指向一维数组元素的指针指向一维数组元素的指针1.定义指向数组元素的指针变量定义指向数组元素的指针变量int a10; /* 数组元素是整型变量数组元素是整型变量 */int *p; /* 定义定义p是指向整型变量的指针变量是指向整型变量的指针变量 */p=&a0; /* 赋值后赋值后p指向指向a

11、数组的数组的0号元素号元素 */p=&a5; /* 赋值后赋值后p指向指向a数组的数组的5号元素号元素 */ p=&a0; 和和 p=a; 两句等价两句等价2.2.指针运算指针运算1 1、指针变量可以和整数做加减操作、指针变量可以和整数做加减操作2 2、指针变量加减一个整数指针变量加减一个整数n, n, 表示指针前后移动表示指针前后移动n n个元素个元素 3 3、地址值增减量等于所指向变量占的字节数、地址值增减量等于所指向变量占的字节数sizeof(type) sizeof(type) int a10; int *p1=&a5; / /* * 定义了定义了p1p1指向整

12、数类型指向整数类型(d=2),(d=2),初值为初值为a5a5的地址的地址 * */ /p1- -; / /* * p1 p1减减1, p11, p1指向指向a4,a4,地址值减地址值减(1(1sizeof(int) sizeof(int) * */ /p1+=3; / /* * p1 p1加加3, p13, p1指向指向a7,a7,地址值加地址值加(3(3sizeof(it) sizeof(it) * */ /两个同类型指针可以相减得到一个整数两个同类型指针可以相减得到一个整数, ,等于对应元素下标差,等于对应元素下标差,等于地址值的差除以地址步进单位。等于地址值的差除以地址步进单位。 两个

13、指针之间不能进行加法、乘法、除法等算术运算。两个指针之间不能进行加法、乘法、除法等算术运算。 空指针空指针定义定义: :指针变量值为零指针变量值为零表示:表示: int int * * p=0; p=0; p指向地址为0的单元,系统保证该单元不作它用表示指针变量值没有意义#define NULL 0int *p=NULL:p=NULLp=NULL与未对与未对p p赋值不同赋值不同用途用途: : 避免指针变量的非法引用避免指针变量的非法引用 在程序中常作为在程序中常作为状态状态比较比较 例 int *p; . while(p!=NULL) . 例 main( ) int i=10; int *p

14、; *p=i; printf(“%d”,*p); 危险!例 main( ) int i=10,k; int *p; p=&k; *p=i; printf(“%d”,*p); 指针变量必须先赋值,再使用.2000200420062005整型变量i10指针变量p200120022003随机3.3.通过指针引用数组元素通过指针引用数组元素#includevoid main() int a10,i; for(i=0;i10;i+) scanf(“%d”,&ai); for(i=0;i10;i+) printf(“%d”,ai);#includevoid main() int a10,i

15、,*p; p=a; for(i=0;i10;i+) scanf(“%d”,p+i); for(i=0;i10;i+) printf(“%d”, *(p+i);#includevoid main() int a10,*p; for(p=a;pa+10;p+) scanf(“%d”,p); for(p=a;pa+10;p+) printf(“%d”, *p);#includevoid main() int a10,i,*p; for(p=a ,i=0; i10; i+,p+) scanf(“%d”,p); for(p=a ,i=0; i10; i+,p+) printf(“%d”, *p);例例

16、7.4 数组名与指向数组元素的指针变量。数组名与指向数组元素的指针变量。main() int a5=10,20,30,40,50, *p=a; printf(p=%x p+1=%xn,p,p+1); printf(a=%x a+1=%xn,a,a+1); /* a地址值地址值步进单位是步进单位是2不是不是10 */ printf(&a0=%x &a1=%x n,&a0,&a1); printf(*p+2=%d *(p+2)=%dn,*p+2,*(p+2); /* 注意注意*p+2和和*(p+2)的区别的区别 */ printf(*a+2=%d *(a+2)=%d

17、n,*a+2,*(a+2);4.4.地址越界问题地址越界问题 (1)(1)不要引用没有赋值的不要引用没有赋值的指针指针变量变量, , 使使用指针用指针变量前变量前一定要对它正确赋值。在选择结构的程序中一定要对它正确赋值。在选择结构的程序中, , 每一个每一个分支路径都应在引用分支路径都应在引用指针指针变量之前对它正确赋值。变量之前对它正确赋值。(2)(2) 用指针用指针变量访问数组元素变量访问数组元素, , 随时要检查随时要检查指针指针的变的变化范围化范围, , 始终不能超越上下界。始终不能超越上下界。(3)(3)指针指针运算中注意各运算符的优先级和结合顺序运算中注意各运算符的优先级和结合顺序

18、, , 多使用括号多使用括号, , 使程序容易理解。使程序容易理解。 指针变量重新赋值后指针变量重新赋值后, , 其中的地址值发生了变化其中的地址值发生了变化, , 新的地址值新的地址值是否指向所需要的变量是否指向所需要的变量, , 新的地址值是否有实际意义新的地址值是否有实际意义, , 系统对系统对此都不作检查此都不作检查, , 需要由程序员自己检查需要由程序员自己检查 5.5.用数组名或指针变量作函数参数。用数组名或指针变量作函数参数。例例 7.6 通过调用一个函数通过调用一个函数, 将整型数组的所有元素加将整型数组的所有元素加10。参数传递用四种方法实现。参数传递用四种方法实现。(1)

19、程序如下:程序如下: #include void add(int b , int n) int i; for(i=0; in; i+) bi+=10; void main( ) int i, a10= 1,2,3,4,5,6,7,8,9,10; add(a,10); for(i=0; i10; i+) printf(%4d,ai); #include void add(int *p, int n) int *pend=p+n; for(; ppend; p+) *p+=10;void main( ) int a10=1,2,3,4,5,6,7,8,9,10, *q=a; add(q,10);

20、for(q=a;qa+10;q+) printf(%4d,*q); (2) 程序如下:程序如下:(3) 程序如下:程序如下: #include void add(int *p, int n) int *pend=p+n; for(; ppend; p+) *p+=10;void main( ) int i, a10= 1,2,3,4,5,6,7,8,9,10; add(a,10); for(i=0; i10; i+) printf(%4d,ai); (4) 程序如下:程序如下:#include void add(int b , int n) int i; for(i=0; in; i+) bi

21、+=10; void main( ) int a10=1,2,3,4,5,6,7,8,9,10, *q=a; add(q,10); for(q=a;qa+10;q+) printf(%4d,*q); #includevoid rmove(int a ,int m, int n) int i,*p,t; for(i=0; ia; p-) *p=*(p-1); *p=t; void main() int m,n,a100,*p; printf(n n=); scanf(%d,&n); printf(Input %d numbers:n,n); for(p=a; pa+n; p+) scan

22、f(%d, p); printf(How many place you want to move?); scanf(%d, &m); rmove(a,m,n); printf(New:n); for(p=a; pa+n; p+) printf(%5d,*p);例例 7.77.7将一维数组的将一维数组的各元素循环右移各元素循环右移m m个位个位置置, , 用函数实现用函数实现 对于二维数组:(1)a是数组名, 包含三个元素 a0,a1,a2(2)每个元素ai 又是一个一维 数组,包含4个 元素aa+1a+2*(*(a+0)+1)*(a0+1)int a34;a0a1a2200020082

23、016200020022008201020162018a00a01a10a11a20a21a02a03a12a13a22a23a0+1a1+1a2+1*(a+0)+1*(a+1)+1*(a+2)+17.3.2 指向多维数组元素和指向分数组的指针 对二维数组对二维数组 int a34,有有 a-二维数组的首地址,即第二维数组的首地址,即第0行的首地址行的首地址 a+i-第第i行行的首地址的首地址 ai *(a+i)-第第i行第行第0列列的元素地址的元素地址 ai+j *(a+i)+j -第第i行第行第j列列的元素地址的元素地址 *(ai+j) *(*(a+i)+j) aija+i=&ai

24、=ai=*(a+i) =&ai0, 值相等,地址运算时步进值不相同值相等,地址运算时步进值不相同 a+i &ai,表示第表示第i行首地址,行首地址,a+1由由2000步进步进2016,实际是,实际是4个元素空间个元素空间 ai *(a+i) &ai0,表示第表示第i行第行第0列元素地址列元素地址a0+1由由2000步进步进2004,实际是,实际是1个元素空间个元素空间int a34;a0a1a2200020162032200020042016202020322036a00a01a10a11a20a21a02a03a12a13a22a23aa+1a+2表示形式含义地址a二

25、维数组名,数组首地址a0,*(a+0),*a第0行第0列元素地址a+1第1行首地址a1,*(a+1)第1行第0列元素地址a1+2,*(a+1)+2,&a12第1行第2列元素地址*(a1+2),*(*(a+1)+2),a12第1行第2列元素值20002000201620162024132.指向数组元素的指针变量指向数组元素的指针变量例例 7.8 用指针变量输出数组元素的值。用指针变量输出数组元素的值。main() int a35= 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,12,13,14,15 ; int *p; for (p=a0;pa0+15;p+) if

26、(p-a0)%5=0) printf(n); printf(%4d,*p); 3.指向分数组的指针变量指向分数组的指针变量例例 7.9 用指向二维数组中分数组的指针变量用指向二维数组中分数组的指针变量, 按行输出二维数组按行输出二维数组各元素的值。各元素的值。main() int a35= 1, 2, 3, 4, 5 , 6, 7, 8, 9, 10, 11,12,13,14,15 ; int *q,(*p)5; for(p=a;pa+3;p+) for(q=*p;q*p+5;q+) printf(%5d,*q); printf(n); 4.用多维数组名和指针变量作函数参数用多维数组名和指针变

27、量作函数参数 (1) 用多维数组名作实参或形参。用多维数组名作实参或形参。 如如: f(int a5, int n);(2) 用指向元素的指针变量作实参或形参。用指向元素的指针变量作实参或形参。 f1(int *p);(3) 用指向分数组的指针变量作实参或形参。用指向分数组的指针变量作实参或形参。 如如:f2(int (*q)5, int m); 注意注意: 后两者之间指针移动时地址的增量是不同的。后两者之间指针移动时地址的增量是不同的。例例 7.10 调用函数求两个矩阵之和调用函数求两个矩阵之和main() int i,j,aMN= 1,2,3,4, 5,6,7,8 ; int bMN=10

28、,20,30,40, 50,60,70,80 ; print(a); print(b); add(b,a); print(b); for(i=0;iM;i+) for(j=0;jN;j+) printf(%6d,aij); printf(n); printf(n);#define M 2#define N 4void add(int (*p1)N,int (*p2)N) int *q1,*q2,(*u)N=p1+M; for(;p1u;p1+,p2+) q1=*p1; for(q2=*p2;q1*p1+N;q1+) *q1+=*q2; q2+; void print(int (*p)N) in

29、t *q,(*u)N=p+M; for(;pu;p+) for(q=*p;q*p+N;q+) printf(%6d,*q); printf(n); printf(n);7.3.3 7.3.3 用字符数组和用字符数组和字符字符型型指针访问字符串指针访问字符串 1.1.用字符用字符型型指针指针变量整体输入变量整体输入/ /输出字符串输出字符串用字符型数组和字符指针两种方法整体输入输出字符串。用字符型数组和字符指针两种方法整体输入输出字符串。#includemain() char s20=I am a student!,*p=s; char *pt=You are a teacher!; print

30、f(%sn,s); printf(%sn,pt); scanf(%s,s); printf(%sn,s); scanf(%s,p); printf(%sn,p); 2.对使用字符指针变量和字符数组的讨论对使用字符指针变量和字符数组的讨论 (1)存储内容不同存储内容不同 (2)分配的内存单元不同分配的内存单元不同 (3)赋值方法不同。赋值方法不同。 (4)指针变量的值是可以改变的指针变量的值是可以改变的, 字符数组名是地址常量字符数组名是地址常量, 它的值是不能改变的它的值是不能改变的 char *p , char s16;scanf(%s,s); /* s是地址常量是地址常量, 有确定地址有确

31、定地址, 正确正确 */scanf (“%s”,p); /* p未指向一个具体的地址未指向一个具体的地址,不应这样做不应这样做 */ char str16=I am a srudent.; /* 只能在变量定义时整体赋值只能在变量定义时整体赋值 */可以用赋值语句将字符串首地址赋值给字符指针变量可以用赋值语句将字符串首地址赋值给字符指针变量 char *a; a=I am a srudent.;3.用字符数组或指针作函数参数传递字符串用字符数组或指针作函数参数传递字符串 void strcpy(char s1,char s2) int i=0; while(s2i!=0) s1i=s2i; i

32、+; s1i=0;void strcpy(char *s1, char *s2) for( ; *s2!=0; s1+, s2+) *s1=*s2; *s1=0;7.3.4 指针数组和指向指针的指针指针数组和指向指针的指针 1. 指针数组的概念指针数组的概念 一个数组一个数组, 其元素均为指针类型变量其元素均为指针类型变量, 称为指针数组称为指针数组 基类型名基类型名 *数组名数组名数组长度数组长度=地址初值列表地址初值列表例如:例如:int int * *p4; p4; 例例 7.15 指针数组的各元素指向整型数据的简单实例指针数组的各元素指向整型数据的简单实例main() static i

33、nt a5=10,20,30,40,50; /* 要用要用a的元素地址做初值的元素地址做初值,应加应加static */ int *q5=&a0,&a1,&a2,&a3,&a4; int *p; for(p=q;pq+5;p+) printf(%dt,*p);例例 7.16 利用指向分数组的指针变量利用指向分数组的指针变量, 输入多个字符串输入多个字符串, 将它们按将它们按行存储在行存储在二维二维字符数组中字符数组中, 然后输出全部字符串。再用字符型指然后输出全部字符串。再用字符型指针数组和指向指针变量的指针变量实现。针数组和指向指针变量的指针变量实现。

34、main() char a420; char (*p)20; /* p是指向分数组的指针变量是指向分数组的指针变量*/ printf(Input strings:n); for(p=a;pa+4;p+) gets(*p); printf(Output strings:n); for(p=a;p0) printf(%sn,*+argv);/* 下标法下标法 */main( int argc, char *argv ) int i; for (i=1;i成员名成员名7.4.2 指向结构体数组指向结构体数组元素元素的指针的指针 指针变量可以指向结构体数组中的元素,改变指针变量的指针变量可以指向结构体

35、数组中的元素,改变指针变量的值就可以通过它访问结构体数组中的各元素。值就可以通过它访问结构体数组中的各元素。struct dot float x, y; ;struct examp a10,*p=a;a0.m=0; a0.n=0;p+;p-x=1; p-y=1;p=p+2;p-x=a0.x+1; p-y= a0.y+1;struct examp int n, m; ;struct examp a10,*p=a;p-n+ 引用引用p指向的结构体变量中成员指向的结构体变量中成员n的值的值, 然后使然后使n增增1。(p+)-n 引用引用p指向的结构体变量中成员指向的结构体变量中成员n的值的值, 然后

36、使然后使p增增1+p-n 使使p指向的结构体变量中成员指向的结构体变量中成员n的值先增的值先增1(不是不是p的值增的值增1), 再引用再引用n的值。的值。(+p)-n 使使p的值增的值增1, 再引用再引用p指向的结构体变量中成员指向的结构体变量中成员n的值。的值。#define N 10#define N 10#include#includestruct student int num; char name12; float score;struct student int num; char name12; float score;struct student sN; struct stud

37、ent sN; main( )main( ) struct student struct student * *p ,p ,* *qN; int i,j,k;qN; int i,j,k; printf ( Input %d students num name scoren,N); printf ( Input %d students num name scoren,N); p=s; p=s; for (i=0; iN; i+) for (i=0; inum,p-name,&p-score); scanf(%d%s%f,&p-num,p-name,&p-score); q

38、i=p+; qi=p+; for (i=0; iN-1; i+) for (i=0; iN-1; i+) k=i; k=i; for (j=i+1; jscorescore) k=j; for (j=i+1; jscorescore) k=j; if (k!=i) p=qi; qi=qk; qk=p; if (k!=i) p=qi; qi=qk; qk=p; printf(No.: Name: scoren); printf(No.: Name: scoren); for (i=0; iN; i+) for (i=0; inum,qi-name,qi-score); printf(%5d%15

39、s %8.1fn,qi-num,qi-name,qi-score); 77886653637489789854s0s1s2s3s4s5s6s7s8s9q0q1q2q3q4q5q6q7q8q977886653637489789854q0q1q2q3q4q5q6q7q8q97.4.3 7.4.3 用指向结构体的指针作函数参数用指向结构体的指针作函数参数 1 1、采取、采取“值传递值传递”的方式的方式函数调用时函数调用时, , 将实参结构体的全部成员按顺序赋值给形参将实参结构体的全部成员按顺序赋值给形参, , 这种传递方式在空间和时间上开销较大这种传递方式在空间和时间上开销较大, ,由于采用值传递由

40、于采用值传递方式方式, , 如果在被调用函数中改变了结构体形参的值如果在被调用函数中改变了结构体形参的值, , 该值该值不能返回主调函数。因此一般较少使用不能返回主调函数。因此一般较少使用 2 2、采取、采取“引用传递引用传递”的方式的方式( (传地址传地址) ) 用指向结构体变量用指向结构体变量( (或数组或数组) )的指针作实参的指针作实参, , 将结构体变将结构体变量量( (或数组或数组) )的地址传给形参。如果在被调用函数中改变的地址传给形参。如果在被调用函数中改变了形参指向的结构体的值了形参指向的结构体的值, , 该值可以带回主调函数该值可以带回主调函数 #define N 10#i

41、nclude#define FMT %4d %12s%8d%8d%8d%10.1fnstruct student int num; char name12; int sc3; float av;main() struct student sN,*p; void input( ); printf(Input student:number name score1 score2 score3n); for(p=s; ps+N; p+) input(p); printf(number name score1 score2 score3 averagen); for(p=s; pnu,p-na,p-sc

42、0,p-sc1,p-sc2,p-av);void input(struct student *s) scanf(%d%s%d%d%d,&s-nu,s-na,&s-sc0,&s-sc1,&s-sc2); s-av=(s-sc0+s-sc1+s-sc2)/3.0;7.5 指针与指针与函数函数7.5.1 7.5.1 返回指针值的函数返回指针值的函数 定义格式定义格式: 类型名类型名 *函数名函数名(参数表参数表);例如:例如: int *f(int x, int y);char *strcpy(char *s1,char *s2) char *p=s1; while(

43、*s1+=*s2+); return(p); main() char s20= I am a student.; printf(%sn,strcpy(s,You are a eacher.);例例 写一个函数,求两个写一个函数,求两个int型变量中居于较大值的变量的地址型变量中居于较大值的变量的地址int *f1(int *x,int *y) if(*x*y)return x; elsereturn y;main() int a=2,b=3; int *p; p=f1(&a, &b); printf(%dn,*p);.20002008200A20022004200623 指针变

44、量y 指针变量x(f1)20022000COPY变量a 变量b(main) 指针变量p*7.5.2 指向函数的指针和函数参数 1.1.定义定义 类型说明符类型说明符 ( (* *变量名变量名)();)(); int (int (* *p)() p)() 2.2.赋值赋值 变量名变量名= =函数名函数名 p=fname;p=fname; 3. 3.调用调用 变量名变量名( (实参列表实参列表) ) p(x,y);p(x,y); 例例 7.23 指向函数的指针程序举例。指向函数的指针程序举例。#includeint f(int x) return 3*x*x+5*x-7; void main()

45、int(*p)(); /* 定义定义p为指向函数的指针变量为指向函数的指针变量*/ int a,y; p=f; / /* * 对指向函数的指针变量对指向函数的指针变量p p赋值赋值* */ / printf(input x= ); scanf(%d,&a); y=(*p)(a); / /* * 用函数指针变量形式调用函数用函数指针变量形式调用函数, , 相当于相当于y=f(a) y=f(a) * */ / printf(y=%dn ,y); 用函数指针变量作函数参数用函数指针变量作函数参数int max(int,int);int min(int,int);int add(int,int);void process(int,int,int (*fun)();void main() int a,b, scanf(%d,%d,&a,&b); process(a,b,max); process(a,b,min); process(a,b,add);void process(int x,int y,int (*fun)() int result; result=(*fun)(x,y); printf(%dn,result);max(int x,int y)

温馨提示

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

评论

0/150

提交评论