(精品)c语言电子教案11(指针).ppt

上传人:hyn****60 文档编号:70946295 上传时间:2023-01-29 格式:PPT 页数:83 大小:1.32MB
返回 下载 相关 举报
(精品)c语言电子教案11(指针).ppt_第1页
第1页 / 共83页
(精品)c语言电子教案11(指针).ppt_第2页
第2页 / 共83页
点击查看更多>>
资源描述

《(精品)c语言电子教案11(指针).ppt》由会员分享,可在线阅读,更多相关《(精品)c语言电子教案11(指针).ppt(83页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、UNIX C编程编程yyyy-M-1age *第第11章章 指指 针针知识点:知识点:&指针的定义指针的定义&指针变量的使用指针变量的使用&各种指针的使用各种指针的使用重点:重点:指针的概念及指针的概念及C语言指针使用的特点语言指针使用的特点指针变量的定义、引用指针变量的定义、引用数组的指针、字符串的指针、函数的指针、指向指针的指针的数组的指针、字符串的指针、函数的指针、指向指针的指针的使用使用难点:难点:s指针的运算和使用指针的运算和使用s指针在数组中的使用及使用特点指针在数组中的使用及使用特点UNIX C编程编程yyyy-M-2age *q 指针是指针是C语言中的一个重要的概念,也是语言中

2、的一个重要的概念,也是C语言的一个重要语言的一个重要特色。特色。v 可以表示复杂的数据结构可以表示复杂的数据结构v 能动态分配内存能动态分配内存v 能方便地使用字符串能方便地使用字符串v 有效而方便地使用数组有效而方便地使用数组v 在调用函数时能得到多于在调用函数时能得到多于1个的值个的值v 能直接处理内存地址等能直接处理内存地址等第第11章章 指指 针针UNIX C编程编程yyyy-M-3age *x xxxyz 20002001 20132014 2020202111.1 地址和指针的概念地址和指针的概念q“直接访问直接访问”方式方式 按变量地址存取变量值的方式按变量地址存取变量值的方式i

3、nt x,y,z;x=20,y=40;z=x+y;x 40 x20yz 20002001 20132014 20202021 编译系统把变量名转换为变量的地址,对变量值的存取编译系统把变量名转换为变量的地址,对变量值的存取通过地址进行的。通过地址进行的。内存内存x 406020yz 20002001 20132014 20202021变量变量z的地址的地址指针指针 UNIX C编程编程yyyy-M-4age *11.1 地址和指针的概念地址和指针的概念q“间接访问间接访问”方式方式 通过存放变量地址的变量去访问变量通过存放变量地址的变量去访问变量 int x,*x_point;x_point=

4、&x;*x_point=20;x x_point 20002001 20132014 x 2000 x_point 20002001 20132014 x 200020 x_point 20002001 20132014 指针指针专门存放变量地址的变量专门存放变量地址的变量指针变量指针变量*x_point指针变量指针变量变量变量变量地址(指针)变量值指向地址存入地址存入指针变量指针变量UNIX C编程编程yyyy-M-5age *11.1 地址和指针的概念地址和指针的概念整型变量整型变量x指针变量指针变量x_pointer2000200420062005200120022003整型变量整型变量

5、k.102000 k=x;/*直接访问直接访问*/x_pointer=&x;k=*x_pointer;/*间接访问间接访问*/1010UNIX C编程编程yyyy-M-6age *q 变量的指针变量的指针v 就是变量的地址就是变量的地址 q 指针变量指针变量v 存放变量地址的变量存放变量地址的变量v 用来指向另一个变量用来指向另一个变量 v 用用“*”符号表示符号表示“指指向向”11.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量UNIX C编程编程yyyy-M-7age *q定义一个指针变量定义一个指针变量v 指针变量不同于整型变量和其他类型的变量,它是用来专门指针变量不同

6、于整型变量和其他类型的变量,它是用来专门存放地址的。存放地址的。v 必须将指针变量定义为必须将指针变量定义为“指针类型指针类型”。v 一般形式一般形式 基类型基类型 *指针变量名指针变量名;基类型:指针变量所指向的变量的类型。基类型:指针变量所指向的变量的类型。例例 float*pointer1;int*pointer2;char*pointer3;v 指针变量的定义是通过指针变量的定义是通过*进行的进行的v 定义后的指针变量只能赋值指针,不能赋值为一般数据类型定义后的指针变量只能赋值指针,不能赋值为一般数据类型11.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量UNIX C

7、编程编程yyyy-M-8age *q指针变量的引用指针变量的引用v&与与*运算符运算符 -单目运算,优先级单目运算,优先级2 2,自右向左结合,自右向左结合&取地址运算符取地址运算符 取变量的地址,取出的地址一定是一个常数取变量的地址,取出的地址一定是一个常数&变量名变量名=指针值指针值 *指针运算符指针运算符 指针变量所指向的内存单元,可称为指针变量所指的指针变量所指向的内存单元,可称为指针变量所指的变量变量 与指针变量定义中的与指针变量定义中的*不同不同“*指针变量指针变量”可以作为一个基类型变量来用可以作为一个基类型变量来用11.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指

8、针变量UNIX C编程编程yyyy-M-9age *11.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量main()int a,b;int*pointer_1,*pointer_2;a=100;b=10;pointer_1=&a;/*把变量把变量a的地址赋给的地址赋给pointer_1*/pointer_2=&b;/*把变量把变量b的地址赋给的地址赋给pointer_2*/printf(%d,%dn,a,b);printf(%d,%dn,*pointer_1,*pointer_2);getch();100,10100,10UNIX C编程编程yyyy-M-10age *v 指

9、针变量的初始化指针变量的初始化 一般形式一般形式 基类型基类型*指针变量名指针变量名=初始地址值初始地址值;11.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量例例 int i;int *p=&i;例例 int i;int *p=&i;int *q=p;例例 int *p=&i;int i;用已初始化指针变量作初值用已初始化指针变量作初值ipqipUNIX C编程编程yyyy-M-11age *11.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量v 指针变量使用前必须先初始化或赋初值指针变量使用前必须先初始化或赋初值例例 main()int i=10,*p;

10、*p=i;printf(“%d”,*p);指针变量指针变量p整型变量整型变量i2000200420062005200120022003.10200210内容随机内容随机结果:结果:10危险!危险!例例 main()int i=10,k,*p;p=&k;*p=i;printf(“%d”,*p);UNIX C编程编程yyyy-M-12age *v 零指针与空类型指针零指针与空类型指针 零指针:零指针:(空指针空指针)定义:指针变量值为零定义:指针变量值为零 表示:表示:int *p=0;11.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量p指向地址为指向地址为0的单元的单元,系统

11、保证该单元不作他用系统保证该单元不作他用(不存放有效数据)(不存放有效数据)表示指针变量值表示指针变量值没有意义没有意义 NULL在在stdio.h中定义,原型为中定义,原型为#define NULL 0 int *p=NULL;用途用途:避免指针变量的非法引用避免指针变量的非法引用 在程序中常作为在程序中常作为状态状态比较比较 例例 int *p;.while(p!=NULL).UNIX C编程编程yyyy-M-13age *11.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量 空类型指针空类型指针 定义:定义:指针变量不指向哪一种类型数据指针变量不指向哪一种类型数据 表示

12、:表示:void *p;使用时要进行使用时要进行强制类型转换强制类型转换表示不指定表示不指定p2是指向哪一种是指向哪一种类型数据的指针变量类型数据的指针变量例例 char *p1;void *p2;p1=(char *)p2;p2=(void*)p1;UNIX C编程编程yyyy-M-14age *11.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量paaffdaffdeffe0ffdfffdbffdcffdd.ffda10main()int a;int*pa=&a;a=10;printf(a=%d,*pa=%d n,a,*pa);printf(“&a=%x(hex),&a)

13、;printf(pa=%x(hex)n,pa);printf(&pa=%x(hex)n,&pa);getch();a=10,*pa=10&a=ffda(hex),pa=ffda(hex)&pa=ffde(hex)UNIX C编程编程yyyy-M-15age *练习练习11.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量 int x,y,*x_pointer,*y_pointer;x_pointer&xx2y_pointer&yy4 x_pointer=&x;y_pointer=&y;y_pointer=&*x_pointer;y=*&x;2&与与*运算符右结合运算符右结合*右

14、侧接指针变量,如:右侧接指针变量,如:*x_pointer&右侧接一般变量,如:右侧接一般变量,如:&xUNIX C编程编程yyyy-M-16age *q指针变量作为函数参数指针变量作为函数参数 作用是将变量的地址传送到另一个函数中作用是将变量的地址传送到另一个函数中11.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量swap(int*p1,int*p2)int temp;temp=*p1;*p1=*p2;*p2=temp;main()int a,b,*pointer_1,*pointer_2;scanf(%d,%d,&a,&b);pointer_1=&a;pointer_2

15、=&b;if(ab)swap(pointer_1,pointer_2);printf(n%d,%dn,a,b);pointer_1?a?pointer_2?b?5,9 59&a&b&ap1&bp2?temp595pointer_1&aa9pointer_2&bb59,5UNIX C编程编程yyyy-M-17age *11.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量swap(int*p1,int*p2)int*temp,x;temp=&x;*temp=*p1;*p1=*p2;*p2=*temp;main()int a,b,*pointer_1,*pointer_2;scan

16、f(%d,%d,&a,&b);pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);printf(n%d,%dn,a,b);pointer_1?a?pointer_2?b?59&a&b&ap1&bp29?temp?x&xtemp?x55pointer_1&aa9pointer_2&bb55,9 9,5UNIX C编程编程yyyy-M-18age *11.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量swap(int*p1,int*p2)int*temp;temp=p1;p1=p2;p2=temp;main()int

17、 a,b,*pointer_1,*pointer_2;scanf(%d,%d,&a,&b);pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);printf(n%d,%dn,a,b);pointer_1?a?pointer_2?b?59&a&b&ap1&bp2?temp5,9 5,9&atemp&b&apointer_1&aa5pointer_2&bb9UNIX C编程编程yyyy-M-19age *q 想通过函数调用得到想通过函数调用得到n n个要改变的值,可以:个要改变的值,可以:v 在主调函数中设在主调函数中设n n个变量,

18、用个变量,用n n个指针变量指向它们个指针变量指向它们v 将指针变量作实参,将这将指针变量作实参,将这n n个变量的地址传给所调用的个变量的地址传给所调用的函数的形参函数的形参v 通过形参指针变量,改变该通过形参指针变量,改变该n n个变量的值个变量的值v 主调函数中就可以使用这些改变了值的变量主调函数中就可以使用这些改变了值的变量11.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量UNIX C编程编程yyyy-M-20age *11.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量 例:输入例:输入a、b、c3个整数,按大小顺序输出。个整数,按大小顺序输出。

19、main()int a,b,c,*p1,*p2,*p3;scanf(%d,%d,%d,&a,&b,&c);p1=&a;p2=&b;p3=&c;exchange(p1,p2,p3);printf(n%d,%d,%dn,a,b,c);swap(int*pt1,int*pt2)int temp;temp=*pt1;pt1=*pt2;*pt2=temp;exchange(int*q1,int*q2,int*q3)if(*q1*q2)swap(q1,q2);if(*q1*q3)swap(q1,q3);if(*q2a1a+1UNIX C编程编程yyyy-M-25age *v 指针的关系运算指针的关系运算

20、实质是两个地址之间的比较,地实质是两个地址之间的比较,地址大的指针大,地址小的指针小址大的指针大,地址小的指针小 pq p=q pq p=q p=q p!=q11.3 数组与指针数组与指针a2a3a4 2000 2008 a1a020002002200420062008200A2024202220202010pqqpUNIX C编程编程yyyy-M-26age *v 引用数组元素的方法引用数组元素的方法 int a5,*p;p=a;11.3 数组与指针数组与指针下标法下标法 ai和和pia2a3a4 2000 a1a020002002200420062008200A20242022202020

21、10p pap0p1p2p3p4指针法指针法*(a+i)和和*(p+i)pp+1p+2p+3p+4aa+1a+2a+3a+4a2a3a4 2000 a1a020002002200420062008200A2024202220202010p p+5UNIX C编程编程yyyy-M-27age *v 例例 输出数组中的全部元素输出数组中的全部元素11.3 数组与指针数组与指针main()int a10=1,2,3,4,5,6,7,8,9,10,*p,i;for(i=0;i10;i+)printf(“%4d”,ai);用下标法引用数组元素用下标法引用数组元素UNIX C编程编程yyyy-M-28ag

22、e *main()int a10=1,2,3,4,5,6,7,8,9,10,*p,i;for(i=0;i10;i+)printf(“%4d”,*(a+i);11.3 数组与指针数组与指针 用指针法引用数组元素用指针法引用数组元素 数组名数组名a在计算过程中代表数组的首地址在计算过程中代表数组的首地址 对对ai进行变址运算,转化为进行变址运算,转化为*(a+i)UNIX C编程编程yyyy-M-29age *main()int a10=1,2,3,4,5,6,7,8,9,10,*p,i;for(p=a;p(a+10);p+)printf(“%4d”,*p);11.3 数组与指针数组与指针 p的初

23、值为数组的初值为数组a的起始地址的起始地址 计算过程中使用了指针加法计算过程中使用了指针加法 数组名数组名a在计算过程中代表数组的首地址在计算过程中代表数组的首地址UNIX C编程编程yyyy-M-30age *main()int a10=1,2,3,4,5,6,7,8,9,10,*p,i;for(p=a,i=0;i10;i+)printf(“%4d”,pi);11.3 数组与指针数组与指针 用下标法引用数组元素用下标法引用数组元素 p的初值为数组的初值为数组a的起始地址的起始地址UNIX C编程编程yyyy-M-31age *11.3 数组与指针数组与指针main()int i,*p,a10

24、;p=a;for(i=0;i10;i+)scanf(%d,p+);printf(n);for(i=0;i10;i+,p+)printf(%d,*p);for(i=0;i10;i+)scanf(%d,p);p+;1 2 3 4 5 6 7 8 9 0 22153 234 0 0 30036 25202 11631 8259 8237 28483a2a3a4 a9?a1a020002002200420062008200A2024202220202010 pp=a;1 2 3 4 5 6 7 8 9 0v例例 通过指针变量输出通过指针变量输出a数组的数组的10个元素个元素UNIX C编程编程yyyy

25、-M-32age *main()int a=5,8,7,6,2;int y,*p=&a1;y=(*-p)+;printf(%d ,y);printf(%d,a0);11.3 数组与指针数组与指针a27a36a42 a18a0520002002200420062008200A2024202220202010 pp65y5 6例:例:UNIX C编程编程yyyy-M-33age *q用数组名作函数参数用数组名作函数参数v 数组名作函数实参,传递给形参的是地址(地址传递)数组名作函数实参,传递给形参的是地址(地址传递)传递的地址是数组的首地址,形参接收的是数组的首地址传递的地址是数组的首地址,形参接

26、收的是数组的首地址 形参定义时为数组,形参数组的维数可省略(一维数组)形参定义时为数组,形参数组的维数可省略(一维数组)实际上,编译系统把形参数组名作为指针变量来处理实际上,编译系统把形参数组名作为指针变量来处理11.3 数组与指针数组与指针UNIX C编程编程yyyy-M-34age *前面已经分析,前面已经分析,指向数组的指针变量指向数组的指针变量可以通过指针法,也可以通过指针法,也可以可以通过下标法引用数组元素通过下标法引用数组元素,所以,所以11.3 数组与指针数组与指针void f(int b)printf(len of b is%dByten,sizeof(b);printf(a1

27、=%d,b1);main()int a3=1,2,3;f(a);len of b is 2Bytea1=2v 例:例:void f(int*b)printf(a1=%d,*(b+1);1232000bba20002ByteUNIX C编程编程yyyy-M-35age *v 数组名作函数参数,实参与形参的对应关系数组名作函数参数,实参与形参的对应关系11.3 数组与指针数组与指针实参实参形参形参数组名数组名指针变量指针变量数组名数组名指针变量指针变量数组名数组名数组名数组名指针变量指针变量指针变量指针变量UNIX C编程编程yyyy-M-36age *例例 将数组将数组a中中n个整数按相反顺序存

28、放个整数按相反顺序存放11.3 数组与指针数组与指针算法:算法:设两个设两个“位置指示变量位置指示变量”i和和j,i的初值为的初值为0,j的初值为的初值为n-1 将将ai与与aj交换交换 使使i的值加的值加1,j的值减的值减1 再将再将ai与与aj对换,直到对换,直到i=(n-1)/2为止为止main()int i,a10=3,7,9,11,0,6,7,5,4,2;printf(The original array:n);for(i=0;i10;i+)printf(%d,ai);printf(n);inv(a,10);printf(The array has been inverted:n);

29、for(i=0;i10;i+)printf(%d,ai);printf(n);UNIX C编程编程yyyy-M-37age *void inv(int x,int n)int temp,i,j,m=(n-1)/2;for(i=0;i=m;i+)j=n-1-i;temp=xi;xi=xj;xj=temp;11.3 数组与指针数组与指针90a29a311a40 a56 a67 a75 a84 a92a17a0320002002200420062008200A20122010200E200Cm=4a29a311a40 a56 a67 a75 a84 a93a17a022000200220042006

30、2008200A20122010200E200Cm=418a29a311a40 a56 a67 a75 a87 a93a14a0220002002200420062008200A20122010200E200Cm=427a25a311a40 a56 a67 a79 a87 a93a14a0220002002200420062008200A20122010200E200Cm=436a25a37a40 a56 a611 a79 a87 a93a14a0220002002200420062008200A20122010200E200Cm=445xa25a37a46 a50 a611 a79 a87

31、a93a14a0220002002200420062008200A20122010200E200Cm=45ijUNIX C编程编程yyyy-M-38age *void inv(int*x,int n)int*p,temp,*i,*j,m=(n-1)/2;i=x;j=x+n-1;p=x+m;for(;i=p;i+,j-)temp=*i;*i=*j;*j=temp;11.3 数组与指针数组与指针jia29a311a40 a56 a67 a75 a84 a92a17a0320002002200420062008200A20122010200E200Cm=4a29a311a40 a56 a67 a75

32、 a84 a93a17a0220002002200420062008200A20122010200E200Cm=4ija29a311a40 a56 a67 a75 a87 a93a14a0220002002200420062008200A20122010200E200Cm=4ija25a311a40 a56 a67 a79 a87 a93a14a0220002002200420062008200A20122010200E200Cm=4ija25a37a40 a56 a611 a79 a87 a93a14a0220002002200420062008200A20122010200E200Cm=4

33、ijxpa25a37a46 a50 a611 a79 a87 a93a14a0220002002200420062008200A20122010200E200Cm=4ijUNIX C编程编程yyyy-M-39age *q多维数组与指针多维数组与指针v 多维数组的地址多维数组的地址 int a34=1,3,5,7,9,11,13,15,17,19,21,23;可以把可以把a看作是一维数组,有看作是一维数组,有3个元素:个元素:a0,a1,a2 a0,a1,a2可以分别认为是包含可以分别认为是包含4个元素的一维数组个元素的一维数组 二维数组是数组的数组二维数组是数组的数组11.3 数组与指针数组与

34、指针a00a01a02a03a10a11a12a13a20a21a22a23aa00a01a02a03a10a11a12a13a20a21a22a23一维数组一维数组aa0a1a2一维数组一维数组a0UNIX C编程编程yyyy-M-40age *11.3 数组与指针数组与指针201620082000a0a1 a2201820102002200020082016a00a01a10a11a20a21a02a03a12a13a22a23aa+1a+2*(*(a+0)+1)元素元素a01可表示为可表示为*(a0+1)a0为数组名,是为数组名,是该数组的首地址该数组的首地址a0+1a1+1a2+1从从

35、a数组中数组中a0可表示可表示*(a+0)所以所以a0+1*(a+0)+1*(a+1)+1*(a+2)+1UNIX C编程编程yyyy-M-41age *11.3 数组与指针数组与指针qa-二维数组的首地址,即第二维数组的首地址,即第0行的行的首地址首地址qa+i-第第i行行的首地址的首地址qai *(a+i)-第第i行第行第0列列的元素的元素地址地址qai+j *(a+i)+j-第第i行第行第j列列的的元素地址元素地址q*(ai+j)*(*(a+i)+j)aija+i=&ai=ai=*(a+i)=&ai0,值相等,含义不同值相等,含义不同a+i&ai,表示第表示第i行首地址,指向行行首地址,

36、指向行ai *(a+i)&ai0,表示第表示第i行第行第0列元素地址,指向列元素地址,指向列列UNIX C编程编程yyyy-M-42age *#define FORMAT%x,%xn#define FORMAT1%d,%dnmain()int a34=1,3,5,7,9,11,13,15,17,19,21,23;printf(FORMAT,a,*a);printf(FORMAT,a0,*(a+0);printf(FORMAT,&a0,&a00);printf(FORMAT,a1,a+1);printf(FORMAT,&a10,*(a+1)+0);printf(FORMAT,a2,*(a+2);

37、printf(FORMAT,&a2,a+2);printf(FORMAT1,a10,*(*(a+1)+0);11.3 数组与指针数组与指针例例 输出二维数组有关的值。输出二维数组有关的值。ffb8,ffb8ffb8,ffb8ffb8,ffb8ffc0,ffc0ffc0,ffc0ffc8,ffc8ffc8,ffc89,9UNIX C编程编程yyyy-M-43age *11.3 数组与指针数组与指针201620082000a0a1 a2201820102002200020082016a00a01a10a11a20a21a02a03a12a13a22a23aa+1a+2a0+1a1+1a2+1*(a

38、+0)+1*(a+1)+1*(a+2)+1可认可认为为存储的存储的是数组是数组a0的的首地址首地址*(*(a+0)+1)*(a0+1)UNIX C编程编程yyyy-M-44age *11.3 数组与指针数组与指针v 指向多维数组元素的指针变量指向多维数组元素的指针变量 指向数组元素的指针变量指向数组元素的指针变量main()int a34=1,3,5,7,9,11,13,15,17,19,21,23;int*p;for(p=a0;pa0+12;p+)if(p-a0)%4=0)printf(n);printf(%4d,*p);1 3 5 7 9 11 13 15 17 19 21 23p指向数组

39、首指向数组首元素元素第第13个元素个元素的首地址的首地址p指针指向下指针指向下一个元素一个元素UNIX C编程编程yyyy-M-45age *11.3 数组与指针数组与指针 在在int anm数组中求数组中求aij的首地址的首地址a00a0ja0m-1ai0aijan-10an-1m-1&aij=&a00+i*m+ji行行j列列UNIX C编程编程yyyy-M-46age *11.3 数组与指针数组与指针 指向由指向由m个元素组成的一维数组的指针变量个元素组成的一维数组的指针变量 定义形式定义形式 数据类型数据类型(*指针变量名指针变量名)一维数组的维数一维数组的维数 例:例:int(*p)4

40、,可以认为数组名称为,可以认为数组名称为*p(*p)0(*p)1(*p)2(*p)3p p只能指向包含只能指向包含4个元素的一维数组个元素的一维数组(p是该数组的首地址是该数组的首地址)可让可让p指向二维数组的某一行指向二维数组的某一行 例:例:int a34,(*p)4=a;一一维数组指针变量维数和二维数组列数必须相同维数组指针变量维数和二维数组列数必须相同*p代表本行第一列的地址代表本行第一列的地址UNIX C编程编程yyyy-M-47age *11.3 数组与指针数组与指针201820102002200020082016a00a01a10a11a20a21a02a03a12a13a22a

41、23pp+1p+2 *(p)+1*(p+1)+1*(p+2)+1*(*(p+1)+1)UNIX C编程编程yyyy-M-48age *v 用指向多维数组的指针作函数参数用指向多维数组的指针作函数参数指针变量作形参接受实参数组名传递来的地址时,可以指针变量作形参接受实参数组名传递来的地址时,可以 用指向变量的指针变量用指向变量的指针变量 用指向一维数组的指针变量用指向一维数组的指针变量例例 有一个班,有一个班,3个学生,各学个学生,各学4门课,计算总平均分数,以及门课,计算总平均分数,以及第第n个学生的成绩。个学生的成绩。11.3 数组与指针数组与指针UNIX C编程编程yyyy-M-49age

42、 *11.3 数组与指针数组与指针main()void average(float*p,int n);void search(float(*p)4,int n);float score34=65,67,70,60,80,87,90,81,90,99,100,98;average(score,12);search(score,2);getch();void average(float*p,int n)float*p_end;float sum=0,aver;p_end=p+n-1;/*最后一行(最后一个学生)最后一列(最后一门成绩)的首地址最后一行(最后一个学生)最后一列(最后一门成绩)的首地址

43、*/for(;p=p_end;p+)sum=sum+(*p);aver=sum/n;printf(naverage=%5.2f n,aver);void search(float(*p)4,int n)int i;printf(the score of No.%d are:n,n);for(i=0;iy?x:y);11.5 指向函数的指针指向函数的指针UNIX C编程编程yyyy-M-60age *11.5 指向函数的指针指向函数的指针q 用指向函数的指针作函数参数用指向函数的指针作函数参数 例例 用函数指针变量作参数,求最大值、最小值和两数之和。用函数指针变量作参数,求最大值、最小值和两数之

44、和。main()int max(int,int);int min(int,int);int add(int,int);void process(int,int,int(*fun)();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)printf(“maxprintf(“max=”);=”)

45、;return(xy?x:y);return(xy?x:y);min(int x,int y)printf(“minprintf(“min=”);=”);return(xy?x:y);return(x*y)return x;else return y;main()int a=2,b=3;int*p;p=f1(&a,&b);printf(%dn,*p);2a3b?p调用函数前调用函数前xy*x*y调用函数调用函数2a3b?p2a3bp调用函数后调用函数后UNIX C编程编程yyyy-M-63age *2a3b?p调用函数前调用函数前11.6返回指针值的函数返回指针值的函数int*f1(int x

46、,int y)if(xy)return&x;else return&y;main()int a=2,b=3;int*p;p=f1(a,b);printf(%dn,*p);xy调用函数调用函数2a3b?p23调用函数后调用函数后2a3bp?!不能把不能把形参形参或或局部变量局部变量的的地址地址作函数返回值作函数返回值不确定不确定UNIX C编程编程yyyy-M-64age *11.7指针数组和指向指针的指针指针数组和指向指针的指针q指针数组的概念指针数组的概念v 数组中的元素为指针变量数组中的元素为指针变量 v 定义形式定义形式 数据类型数据类型*数组名数组名数组长度数组长度 int*p4;ch

47、ar*name5;(元素元素)指针变量所指数据的数据类型指针变量所指数据的数据类型区分区分int *p4与与int (*p)4v 用指针数组执行若干字符串,可以节省内存单元以及处用指针数组执行若干字符串,可以节省内存单元以及处理灵活理灵活Followme0BASIC0GreatWall0FORTRAN0Computerdesign0name0name1name3name2name4Follow meBASICGreat WallFORTRANComputer designname用二维数组,用二维数组,浪费存储空间浪费存储空间UNIX C编程编程yyyy-M-65age *#include v

48、oid sort(char*name,int n)char*temp;int i,j,k;for(i=0;in-1;i+)k=i;for(j=i+1;j0)k=j;if(k!=i)temp=namei;namei=namek;namek=temp;main()char*name=Follow me,BASIC,Great Wall,FORTRAN,Computer;int n=5;sort(name,n);print(name,n);例:将若干字符串按字母顺序(由小到大)输出例:将若干字符串按字母顺序(由小到大)输出定义指针数组定义指针数组传递指针数组传递指针数组name的首地址的首地址nam

49、ek,第第k个个字符串字符串的首地址,进的首地址,进行字符串行字符串比较比较元元素交换指针素交换指针void print(char*name,int n)int i;for(i=0;in;i+)printf(%sn,namei);name0name1name3name2name4Follow meBASICGreat WallFORTRANComputer designnamename0name1name3name2name4Follow meBASICGreat WallFORTRANComputer designnameUNIX C编程编程yyyy-M-66age *11.7指针数组和指向

50、指针的指针指针数组和指向指针的指针q指向指针的指针指向指针的指针v 指向指针数据的指针变量指向指针数据的指针变量(即指针变量存放的是指针变即指针变量存放的是指针变量的地址量的地址)v 定义形式定义形式 数据类型数据类型 *指针名指针名最终目标变量的数据类型最终目标变量的数据类型v 例:例:int c=5,*p,*q;p=&c;q=&p;5c&cp*p&pq*q*q printf(%d,%d,%d,c,*p,*q);5,5,5UNIX C编程编程yyyy-M-67age *11.7指针数组和指向指针的指针指针数组和指向指针的指针main()char *a=hello,world,China,*p

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com