指针与二维数组.ppt_第1页
指针与二维数组.ppt_第2页
指针与二维数组.ppt_第3页
指针与二维数组.ppt_第4页
指针与二维数组.ppt_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

1、第六节 二维数组和指针,对于一维数组: (1)数组名array表示数组的首地址, 即array0的地址; (2)数组名array是地址常量 (3)array+i是元素arrayi的地址 (4)arrayi *(array+i),二维数组的地址,对于二维数组: (1)a是数组名, 包含三个元素 a0,a1,a2 (2)每个元素ai 又是一个一维 数组,包含4个 元素,int a3 ;,基类型,行指针与列指针,4,int a34;,地址 a0+0 a0+1 a0+2 a0+2 a1+0 a1+1 a1+2 a1+2 a2+0 a2+1 a2+2 a2+2,对应值 *(a0+0) *(a0+1) *

2、(a0+2) *(a0+2) *(a1+0) *(a1+1) *(a1+2) *(a1+2) *(a2+0) *(a2+1) *(a2+2) *(a2+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) aij,a+i= int *p; for(p=a0;pa0+12;p+) if(p-a0)%4=0) printf(n); printf(%4d ,*p); ,p=*a; p=,指向二维数组元素的指针变量,指

3、向一维数组的指针变量 定义形式: 数据类型 (*指针名)一维数组维数; 例 int (*p)4;,( )不能少 int (*p)4与int *p4不同,p的值是一维数组的 首地址,p是行指针,可让p指向二维数组某一行 如 int a34, (*p)4=a;,一维数组指针变量维数和 二维数组列数必须相同,例 一维数组指针变量举例,main() static int a34=1,3,5,7,9,11,13,15,17,19,21,23; int i,j,(*p)4; for(p=a,i=0;i3;i+,p+) for(j=0;j4;j+) printf(%d ,*(*p+j); printf(n)

4、; ,p=a0; p=*a; p=, p0j,指向指针的指针(二级指针),main() int a34= 1,2,3,4, 3,4,5,6, 5,6,7,8 ; int i; int *p=a; for(i=0;i3;i+) for (j=0;j4;j+) printf(%d, *(*(p+i)+j); ,格式: 类型名 *指针名;,第七节 二维数组的指针作函数参数,一、 形参的格式,1. 用指向数组的指针变量 例:fun(double (*p)N,2. 用二维数组 例:fun(double aN); 或: fun(double aMN,3. 用二级指针 例:fun(double *p);,4

5、. 用指针数组 例:fun(double *aM); 或 fun(double *a);,例 3个学生各学4门课,计算总平均分,并输出第n个学生成绩,main() void average(float *p,int n); void search(float (*p)4,int n); float score34= 65,67,79,60,80,87,90,81, 90,99,100,98; average(*score,12); search(score,2); ,void average(float *p,int n) float *p_end, sum=0,aver; p_end=p+n

6、-1; for(;p=p_end;p+) sum=sum+(*p); aver=sum/n; printf(average=%5.2fn,aver); void search(float (*p)4, int n) int i; printf( No.%d :n,n); for(i=0;i4;i+) printf(%5.2f ,*(*(p+n)+i); ,列指针,行指针,函数说明,float p4, pni,例 3个学生各学4门课,计算总平均分,并查找一门以上课 不及格学生, 输出其各门课成绩, pji,输出杨辉三角形(程序见P133),1 1 1 2 1 1 3 3 1 1 4 6 4 1

7、1 5 10 10 5 1 1 6 15 20 15 6 1,分析 特点是: 第一列是1 对角线为1 从第三行开始,每数是它上面前一列和它对应列的和 可用 aij=ai-1j-1+ai-1j表示,6.4 指针与字符串 字符串表示形式 用字符数组实现,例 main( ) char string=“I love China!”; printf(“%sn”,string); printf(“%sn”,string+7); ,String+7,运行结果:,I love China!,China!,用字符指针实现,例 main( ) char *string=“I love China!”; print

8、f(“%sn”,string); string+=7; while(*string) putchar(*string); string+; ,字符指针初始化:把字符串首地址赋给string char *string; string=“I love China!”;,*string!=0,字符串指针作函数参数,例 用函数调用实现字符串复制,(1)用字符数组作参数,(2)用字符指针变量作参数,void copy_string(char from,char to) int i=0; while(fromi!=0) toi=fromi; i+; toi=0; main() char a=I am a

9、teacher.; char b=You are a student.; printf(string_a=%sn string_b=%sn,a,b); copy_string(a,b); printf(nstring_a=%snstring_b=%sn,a,b); ,void copy_string(char *from,char *to) for(;*from!=0;from+,to+) *to=*from; *to=0; main() char *a=I am a teacher.; char *b=You are a student.; printf(string_a=%snstring

10、_b=%sn,a,b); copy_string(a,b); printf(nstring_a=%snstring_b=%sn,a,b); ,字符指针变量与字符数组 char *cp; 与 char str20; str由若干元素组成,每个元素放一个字符;而cp中存放字符串首地址 char str20; str=“I love China!”; () char *cp; cp=“I love China!”; () str是地址常量;cp是地址变量 cp接受键入字符串时,必须先开辟存储空间,例 char str10; scanf(“%s”,str); () 而 char *cp; scanf(

11、“%s”, cp); (),改为: char *cp,str10; cp=str; scanf(“%s”,cp); (),字符串与数组关系 字符串用一维字符数组存放 字符数组具有一维数组的所有特点 数组名是指向数组首地址的地址常量 数组元素的引用方法可用指针法和下标法 数组名作函数参数是地址传递等 区别 存储格式:字符串结束标志 赋值方式与初始化 输入输出方式:%s %c,char str=“Hello!”; () char str=“Hello!”; () char str=H,e,l,l,o,!; () char *cp=“Hello”; () int a=1,2,3,4,5; () in

12、t *p=1,2,3,4,5; (),char str10,*cp; int a10,*p; str=“Hello”; () cp=“Hello!”; () a=1,2,3,4,5; () p=1,2,3,4,5; (),scanf(“%s”,str); printf(“%s”,str); gets(str); puts(str);,6.5 指针与函数 函数指针:函数在编译时被分配的入口地址,用函数名表示,函数指针变量赋值:如p=max;,函数返回值的数据类型,专门存放函数入口地址 可指向返回值类型相同的不同函数,指向函数的指针变量 定义形式: 数据类型 (*指针变量名)(); 如 int (

13、*p)();,函数指针变量指向的函数必须有函数说明,函数调用形式: c=max(a,b); c=(*p)(a,b); c=p (a,b); 对函数指针变量pn, p+, p-无意义,( )不能省 int (*p)() 与 int *p()不同,例 用函数指针变量调用函数,比较两个数大小,main() int max(int ,int); int a,b,c; scanf(%d,%d, ,main() int max(int ,int), (*p)(); int a,b,c; p=max; scanf(%d,%d, ,用函数指针变量作函数参数,例 用函数指针变量作参数,求最大值、最小值和两数之和

14、,6.6 返回指针值的函数 函数定义形式: 类型标识符 *函数名(参数表); 例 int *f(int x, int y),例 指针函数实现:有若干学生成绩,要求输入学生序号后, 能输出其全部成绩,main() float score4=60,70,80,90, 56,89,67,88,34,78,90,66; float *search(float (*pointer)4,int n), *p; int i,m; printf(Enter the number of student:); scanf(%d, ,例 写一个函数,求两个int型变量中居于较大值的变量的地址,2,3,2002,20

15、00,*,例 写一个函数,求两个int型变量中居于较大值的变量的地址,2002,例 写一个函数,求两个int型变量中居于较大值的变量的地址,2,3,3,2,*,例 写一个函数,求两个int型变量中居于较大值的变量的地址,不能返回形参或局部变量 的地址作函数返回值,200A,6.7 指针数组和多级指针 用于处理二维数组或多个字符串 指针数组 定义:数组中的元素为指针变量 定义形式:存储类型 数据类型 *数组名数组长度说明; 例 int *p4;,指针所指向变量的数据类型,指针本身的存储类型,区分int *p4与int (*p)4,指针数组赋值与初始化,指针数组赋值与初始化,char name59

16、=“gain”,“much”,“stronger”, “point”,“bye”;,char *name5=“gain”,“much”,“stronger”, “point”,“bye”;,二维数组与指针数组区别:,二维数组存储空间固定 字符指针数组相当于可变列长的二维数组 分配内存单元=数组维数*2+各字符串长度,指针数组元素的作用相当于二维数组的行名 但指针数组中元素是指针变量 二维数组的行名是地址常量,main() int b23,*pb2; int i,j; for(i=0;i2;i+) for(j=0;j3;j+) bij=(i+1)*(j+1); pb0=b0; pb1=b1; f

17、or(i=0;i2;i+) for(j=0;j3;j+,pbi+) printf(b%d%d:%2dn,i,j,*pbi); ,例 用指针数组处理二维数组,例 对字符串排序(简单选择排序),main() void sort(char *name,int n), print(char *name,int n); char *name=Follow me,BASIC, Great Wall,FORTRAN,Computer ; int n=5; sort(name,n); print(name,n); void sort(char *name,int n) char *temp; int i,j,

18、k; for(i=0;i0) k=j; if(k!=i) temp=namei; namei=namek; namek=temp; ,i=0,例 对字符串排序(简单选择排序),main() void sort(char *name,int n), print(char *name,int n); char *name=Follow me,BASIC, Great Wall,FORTRAN,Computer ; int n=5; sort(name,n); print(name,n); void sort(char *name,int n) char *temp; int i,j,k; for(

19、i=0;i0) k=j; if(k!=i) temp=namei; namei=namek; namek=temp; ,name0,name1,name2,name3,name4,name,Great Wall,FORTRAN,Computer,Follow me,BASIC,i=1,例 对字符串排序(简单选择排序),main() void sort(char *name,int n), print(char *name,int n); char *name=Follow me,BASIC, Great Wall,FORTRAN,Computer ; int n=5; sort(name,n)

20、; print(name,n); void sort(char *name,int n) char *temp; int i,j,k; for(i=0;i0) k=j; if(k!=i) temp=namei; namei=namek; namek=temp; ,name0,name1,name2,name3,name4,name,Great Wall,FORTRAN,Computer,Follow me,BASIC,i=2,例 对字符串排序(简单选择排序),main() void sort(char *name,int n), print(char *name,int n); char *n

21、ame=Follow me,BASIC, Great Wall,FORTRAN,Computer ; int n=5; sort(name,n); print(name,n); void sort(char *name,int n) char *temp; int i,j,k; for(i=0;i0) k=j; if(k!=i) temp=namei; namei=namek; namek=temp; ,name0,name1,name2,name3,name4,name,Great Wall,FORTRAN,Computer,Follow me,BASIC,i=3,例 对字符串排序(简单选择

22、排序),main() void sort(char *name,int n), print(char *name,int n); char *name=Follow me,BASIC, Great Wall,FORTRAN,Computer ; int n=5; sort(name,n); print(name,n); void sort(char *name,int n) char *temp; int i,j,k; for(i=0;i0) k=j; if(k!=i) temp=namei; namei=namek; namek=temp; ,name0,name1,name2,name3,

23、name4,name,Great Wall,FORTRAN,Computer,Follow me,BASIC,多级指针 定义: 指向指针的指针 一级指针:指针变量中存放目标变量的地址,例 int *p1; int *p2; int i=3; p2=,二级指针:指针变量中存放一级指针变量的地址,例 int *p; int i=3; p=,一级指针,单级间接寻址,二级指针,一级指针,目标变量,二级间接寻址,定义形式:存储类型 数据类型 *指针名; 如 char *p;,例 int i, *p; p= ()/p是二级指针,不能用变量地址为其赋值,指针本身的存储类型,最终目标变量的数据类型,*p是p间

24、接指向对象的地址 *p是p间接指向对象的值,例 int i=3; int *p1; int *p2; p1=,多级指针,例 三级指针 int *p; 四级指针 char *p;,例 一级指针与二级指针,#include void swap(int *r,int *s) int *t; t=r; r=s; s=t; main() int a=1,b=2,*p,*q; p= ,2000,2002,2000,例 一级指针与二级指针,#include void swap(int *r,int *s) int *t; t=r; r=s; s=t; main() int a=1,b=2,*p,*q; p=

25、 ,输出: 1,2,例 一级指针与二级指针,#include void swap(int *r,int *s) int *t; t=r; r=s; s=t; main() int a=1,b=2,*p,*q; p= ,输出: 1,2,例 一级指针与二级指针,#include void swap(int *r,int *s) int *t; t=*r; *r=*s; *s=t; main() int a=1,b=2,*p,*q; p= ,2000,2002,2000,例 一级指针与二级指针,#include void swap(int *r,int *s) int *t; t=*r; *r=*s; *s=t; main() int a=1,b=2,*p,*q; p= ,2000,2002,输出: 2,1,例 一级指针与二级指针,#include void swap(int *r,int *s) int *t; t=*r; *r=*s; *s=t; main() int a=1,b=2,*p,*q; p= ,输出: 2,1,例 用二级指针处理字符串,#define NULL 0 void main() char *p; char *name=hello,good,world,bye,; p=name+1; printf(%o : %s , *p,*p)

温馨提示

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

评论

0/150

提交评论