《指针与二维数组课堂PPT》由会员分享,可在线阅读,更多相关《指针与二维数组课堂PPT(49页珍藏版)》请在金锄头文库上搜索。
1、第六节 二维数组和指针对于一维数组:(1)数组名array表示数组的首地址, 即array0的地址;(2)数组名array是地址常量(3)array+i是元素arrayi的地址(4)arrayi *(array+i)arrayint array10;二维数组的地址对于二维数组:(1)a是数组名, 包含三个元素 a0,a1,a2(2)每个元素ai 又是一个一维 数组,包含4个 元素aa+1a+2int a3 ; a0a1a2200020082016200020022008201020162018a00a01a10a11a20a21a02a03a12a13a22a23基类型行指针与列指针a0+ia
2、1+ia2+i*(a+0)+i*(a+1)+i*(a+2)+i4int a34;地址a0+0a0+1a0+2a0+2a1+0a1+1a1+2a1+2a2+0a2+1a2+2a2+2对应值*(a0+0)*(a0+1)*(a0+2)*(a0+2)*(a1+0)*(a1+1)*(a1+2)*(a1+2)*(a2+0)*(a2+1)*(a2+2)*(a2+2)l对二维数组 int a34,有ua-二维数组的首地址,即第0行的首地址ua+i-第i行的首地址uai *(a+i)-第i行第0列的元素地址uai+j *(a+i)+j -第i行第j列的元素地址u*(ai+j) *(*(a+i)+j) aijla
3、+i=&ai=ai=*(a+i) =&ai0, 值相等,含义不同ua+i &ai,表示第i行首地址,指向行uai *(a+i) &ai0,表示第i行第0列元素地址,指向列int a34;a0a1a2200020082016200020022008201020162018a00a01a10a11a20a21a02a03a12a13a22a23aa+1a+2int a34;a00a01a10a11a20a21a02a03a12a13a22a23二维数组元素表示形式:(1)a12(2)*(a1+2)(3)*(*(a+1)+2)(4)*(&a00+1*4+2)地址表示:(1) a+1 (2) &a10
4、(3) a1(4) *(a+1)(5)(int *) (a+1)行指针列指针地址表示:(1) &a12(2) a1+2(3) *(a+1)+2(4)&a00+1*4+2例 指向二维数组元素的指针变量main() static 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); p=*a; p=&a00; p=*(a+0); p=a; int a34;a00a01a10a11a20a21a02a03a12a13a22a23pp+1p
5、+2p+7p+11指向二维数组元素的指针变量l指向一维数组的指针变量u定义形式: 数据类型 (*指针名)一维数组维数; 例 int (*p)4;( )不能少int (*p)4与int *p4不同p的值是一维数组的首地址,p是行指针u可让p指向二维数组某一行 如 int a34, (*p)4=a;int a34;a00a01a10a11a20a21a02a03a12a13a22a23aa+1a+2pp+1p+2p0+1或 *p+1p1+2或 *(p+1)+2*(*p+1)或 (*p)1 *(*(p+1)+2)一维数组指针变量维数和二维数组列数必须相同例 一维数组指针变量举例main() stat
6、ic 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);p=a0; p=*a; p=&a00; p=&a0; int a34;a00a01a10a11a20a21a02a03a12a13a22a23ppp 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
7、;j4;j+) printf(%d, *(*(p+i)+j); 123434565678p*p*p+1*p+2格式: 类型名 *指针名;*p+3p+1p+2第七节 二维数组的指针作函数参数一、 形参的格式1. 用指向数组的指针变量 例:fun(double (*p)N2. 用二维数组 例:fun(double aN); 或: fun(double aMN3. 用二级指针 例:fun(double *p); 4. 用指针数组 例:fun(double *aM); 或 fun(double *a); 例 3个学生各学4门课,计算总平均分,并输出第n个学生成绩main() void average(
8、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-1; for(;p=p_end;p+)sum=sum+(*p); aver=sum/n; printf(average=%5.2fn,aver);void search(float (*p)4,
9、int n) int i; printf( No.%d :n,n); for(i=0;i4;i+) printf(%5.2f ,*(*(p+n)+i);列指针行指针函数说明float p46552796080879081909910098 pnipp例 3个学生各学4门课,计算总平均分,并查找一门以上课 不及格学生, 输出其各门课成绩void search(float (*p)4, int n) int i,j,flag; for(j=0;jn;j+) flag=0;for(i=0;i4;i+) if(*(*(p+j)+i)60) flag=1;if(flag=1) printf(No.%d
10、is fail,his scores are:n,j+1); for(i=0;iy) z=x; else z=y; return(z);main() int max(int ,int), (*p)(); int a,b,c; p=max; scanf(%d,%d,&a,&b); c=(*p)(a,b); printf(a=%d,b=%d,max=%dn,a,b,c);int max(int x,int y) int z; if(xy) z=x; else z=y; return(z);用函数指针变量作函数参数例 用函数指针变量作参数,求最大值、最小值和两数之和void main() int a
11、,b,max(int,int), min(int,int),add(int,int); void process(int,int,int (*fun)(); 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(“max=”);printf(“max=”); return(xy?x
12、:y); return(xy?x:y);min(int x,int y) printf(“min=”);printf(“min=”); return(xy?x:y); return(xy?x:y);add(int x,int y) printf(“sum=”); printf(“sum=”); return(x+y); return(x+y);6.6 返回指针值的函数 函数定义形式: 类型标识符 *函数名(参数表);例 int *f(int x, int y)例 指针函数实现:有若干学生成绩,要求输入学生序号后, 能输出其全部成绩main() float score4=60,70,80,90,
13、 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,&m); printf(The scores of No.%d are:n,m); p=search(score,m); for(i=0;i*y)return x; elsereturn y;main() int a=2,b=3; int *p; p=f1(&a, &b); printf(%dn,*p);.20002008200A20022004
14、200623 指针变量y 指针变量x(f1)20022000COPY变量a 变量b(main) 指针变量p*例 写一个函数,求两个int型变量中居于较大值的变量的地址.20002008200A2002200420062变量a 变量b(main)3 指针变量p*2002int *f3(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);例 写一个函数,求两个int型变量中居于较大值的变量的地址int *f3(int x,int y) if(xy)
15、return &x; elsereturn &y;main() int a=2,b=3; int *p; p=f3(a, b); printf(%dn,*p);.20002008200A20022004200623 变量y 变量x(f3)32COPY变量a 变量b(main) 指针变量p*例 写一个函数,求两个int型变量中居于较大值的变量的地址不能返回形参或局部变量的地址作函数返回值.20002008200A2002200420062变量a 变量b(main)3 指针变量p*200Aint *f3(int x,int y) if(xy)return &x; elsereturn &y;mai
16、n() int a=2,b=3; int *p; p=f3(a,b); printf(%dn,*p);6.7 指针数组和多级指针用于处理二维数组或多个字符串指针数组v定义:数组中的元素为指针变量v定义形式:存储类型 数据类型 *数组名数组长度说明;例 int *p4;指针所指向变量的数据类型指针本身的存储类型区分int *p4与int (*p)4v指针数组赋值与初始化赋值:main() int b23,*pb2; pb0=b0; pb1=b1; .int *pb2pb0pb1int b23123246初始化:main() int b23,*pb =b0,b1; .int *pb2pb0pb1i
17、nt b23123246v指针数组赋值与初始化L i s p 0F o r t r a n 0B a s i c 0p0p1p2p30赋值:main() char a=Fortran; char b=Lisp; char c=Basic; char *p4; p0=a; p1=b; p2=c; p3=NULL; .或:main() char *p4; p0= Fortran; p1= Lisp; p2= Basic; p3=NULL; .初始化:main() char *p=Fortran, Lisp, Basic,NULL; .L i s p 0F o r t r a n 0B a s i
18、c 0p0p1p2p30 char name59=“gain”,“much”,“stronger”, “point”,“bye”; char *name5=“gain”,“much”,“stronger”, “point”,“bye”;g a i n 0s t r o n g e r 0p o i n t 0m u c h 0name0name1name2name3name4b y e 0g a i n 0s t r o n g e r 0p o i n t 0m u c h 0b y e 0v二维数组与指针数组区别:二维数组存储空间固定字符指针数组相当于可变列长的二维数组分配内存单元=数组维
19、数*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; for(i=0;i2;i+) for(j=0;j3;j+,pbi+) printf(b%d%d:%2dn,i,j,*pbi);例 用指针数组处理二维数组int *pb2pb0pb1int b23b00 *pb0b01 *(pb0+1)b02 *(pb0+2)b10 *pb1b11 *(pb1+1)b12
20、*(pb1+2)123246例 对字符串排序(简单选择排序)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;in-1;i+) k=i; for(j=i+1;j0) k=j; if(k!=i) temp=namei; n
21、amei=namek; namek=temp; name0name1name2name3name4nameGreat WallFORTRANComputerFollow meBASICkjkjjji=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)
22、 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; name0name1name2name3name4nameGreat WallFORTRANComputerFollow meBASICkkjjji=1k例 对字符串排序(简单选择排序)main() void sort(char *name,int n), print(char *name,int n); char *name=Follow me,BASIC, Great W
23、all,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;in-1;i+) k=i; for(j=i+1;j0) k=j; if(k!=i) temp=namei; namei=namek; namek=temp; name0name1name2name3name4nameGreat WallFORTRANComputerFollow meBASICkkjji=2例 对字符串排序(简单选择排序)main() void
24、 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;in-1;i+) k=i; for(j=i+1;j0) k=j; if(k!=i) temp=namei; namei=namek; namek=temp; name0name1name2na
25、me3name4nameGreat WallFORTRANComputerFollow meBASICkkji=3例 对字符串排序(简单选择排序)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;in-1;i+) k=i
26、; for(j=i+1;j0) k=j; if(k!=i) temp=namei; namei=namek; namek=temp; name0name1name2name3name4nameGreat WallFORTRANComputerFollow meBASIC多级指针v定义: 指向指针的指针v一级指针:指针变量中存放目标变量的地址p1&p2&i3P2(指针变量)i(整型变量)例 int *p1; int *p2; int i=3; p2=&i; p1=&p2; *p1=5;v二级指针:指针变量中存放一级指针变量的地址例 int *p; int i=3; p=&i; *p=5;&i3P
27、(指针变量)i(整型变量)一级指针单级间接寻址二级指针一级指针目标变量二级间接寻址l定义形式:存储类型 数据类型 *指针名;如 char *p;例 int i, *p; p=&i; ()/p是二级指针,不能用变量地址为其赋值指针本身的存储类型最终目标变量的数据类型*p是p间接指向对象的地址*p是p间接指向对象的值例 int i=3; int *p1; int *p2; p1=&i; p2=&p1; *p=5;ip1p23&i&p1*p2, *p1*p2v多级指针例 三级指针 int *p; 四级指针 char *p;20002008200A20022004200612变量a 变量b(main)
28、 指针变量p2000 指针变量q2002例 一级指针与二级指针#include void swap(int *r,int *s) int *t; t=r; r=s; s=t;main() int a=1,b=2,*p,*q; p=&a; q=&b; swap(p,q); printf(%d,%dn,*p,*q);20022000COPY 指针变量s 指针变量r(swap) 指针变量t20002002200020002008200A20022004200612变量a 变量b(main) 指针变量p2000 指针变量q2002例 一级指针与二级指针#include void swap(int *r
29、,int *s) int *t; t=r; r=s; s=t;main() int a=1,b=2,*p,*q; p=&a; q=&b; swap(p,q); printf(%d,%dn,*p,*q);输出: 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=&a; q=&b; swap(p,q); printf(%d,%dn,*p,*q);abpqabpqrsabpqsrabpq输出: 1,2例 一级指针与二级指针#include void swa
30、p(int *r,int *s) int *t; t=*r; *r=*s; *s=t;main() int a=1,b=2,*p,*q; p=&a; q=&b; swap(&p,&q); printf(%d,%dn,*p,*q);20002008200A20022004200612变量a 变量b(main) 指针变量p2000 指针变量q200220062004COPY 二级指针s 二级指针r(swap) 指针变量t200020022000例 一级指针与二级指针#include void swap(int *r,int *s) int *t; t=*r; *r=*s; *s=t;main()
31、int a=1,b=2,*p,*q; p=&a; q=&b; swap(&p,&q); printf(%d,%dn,*p,*q);20002008200A20022004200612变量a 变量b(main) 指针变量p2000 指针变量q200220002002输出: 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=&a; q=&b; swap(&p,&q); printf(%d,%dn,*p,*q);abpqbapqabrspqabrs
32、pq输出: 2,1例 用二级指针处理字符串#define NULL 0void main() char *p; char *name=hello,good,world,bye,; p=name+1; printf(%o : %s , *p,*p); p+=2; while(*p!=NULL) printf(%sn,*p+);name0name1name2name3name4char *name5worldbye0hellogoodnamep运行结果:644 : good bye用*p可输出地址(%o或%x), 也可用它输出字符串(%s)p*(p+)v二级指针与指针数组的关系int *p 与 i
33、nt *q10 l指针数组名是二级指针常量lp=q; p+i 是qi的地址l指针数组作形参,int *q 与int *q完全等价;但作为变量定义两者不同l系统只给p分配能保存一个指针值的内存区;而给q分配10块内存区,每块可保存一个指针值命令行参数v命令行:在操作系统状态下,为执行某个程序而键入的一行字符v命令行一般形式:命令名 参数1 参数2参数nmain(int argc, char *argv) v命令行参数传递v带参数的main函数形式:C:TC copy.exe source.c temp.c有3个字符串参数的命令行命令行中参数个数元素指向命令行参数中各字符串首地址形参名任意命令行实
34、参main(形参)系统自动调用main函数时传递第一个参数: main所在的可执行文件名可执行文件名例 输出命令行参数/*test.c*/main(int argc, char *argv) while(argc1) +argv; printf(%sn,*argv); -argc; main(int argc, char *argv) while(argc-0) printf(%sn,*argv+);1. 编译、链接test.c,生成可执行文件test.exe2. 在DOS状态下运行(test.exe所在路径下)例如: C:TC test.exe hello world!运行结果:hello
35、world!运行结果:test hello world!argv0argv1argv2char *argvworldtesthelloargvargc=3定义含义int i;int *p;int an;int *pn;int (*p)n;int f();int *p();int (*p)();int *p;定义整型变量ip为指向整型数据的指针变量定义含n个元素的整型数组an个指向整型数据的指针变量组成的指针数组pp为指向含n个元素的一维整型数组的指针变量f为返回整型数的函数p为返回指针的函数,该指针指向一个整型数据p为指向函数的指针变量,该函数返回整型数p为指针变量,它指向一个指向整型数据的指针变量指针的数据类型例 下列定义的含义(1)int *p3;(2)int (*p)3;(3)int *p(int);(4)int (*p)(int);(5)int *(*p)(int);(6)int (*p3)(int);(7)int *(*p3)(int);函数指针数组,函数返回int型指针指针数组指向一维数组的指针返回指针的函数指向函数的指针,函数返回int型变量指向函数的指针,函数返回int 型指针函数指针数组,函数返回int型变量个人观点供参考,欢迎讨论