算法语言与数据结构第6章.pptx
《算法语言与数据结构第6章.pptx》由会员分享,可在线阅读,更多相关《算法语言与数据结构第6章.pptx(53页珍藏版)》请在咨信网上搜索。
算法算法语言言与数与数据据结构构信息信息与与物流管理系物流管理系王健王健西安财经学院管理学院西安财经学院管理学院西安财经学院管理学院西安财经学院管理学院第第6章章 指指针信息信息与与物流管理系物流管理系主要内容主要内容指针的概念及定义指针的概念及定义指针的概念及定义指针的概念及定义变量的指针与指向变量的指针变量变量的指针与指向变量的指针变量变量的指针与指向变量的指针变量变量的指针与指向变量的指针变量数组的指针与指向数组的指针变量数组的指针与指向数组的指针变量数组的指针与指向数组的指针变量数组的指针与指向数组的指针变量字符串的指针与指向字符串的指针变量字符串的指针与指向字符串的指针变量字符串的指针与指向字符串的指针变量字符串的指针与指向字符串的指针变量函数的指针与指向函数的指针变量函数的指针与指向函数的指针变量函数的指针与指向函数的指针变量函数的指针与指向函数的指针变量返回指针值的函数返回指针值的函数返回指针值的函数返回指针值的函数数组和指向指针的指针数组和指向指针的指针数组和指向指针的指针数组和指向指针的指针指针及指针小结指针及指针小结指针及指针小结指针及指针小结第第6章章 指针指针信息信息与与物流管理系物流管理系第第6章章 指指针 6.1 6.1 指指指指针针概概概概念及定念及定念及定念及定义义1 1 6.2 6.2 变变量的指量的指量的指量的指针针和指向和指向和指向和指向变变量的指量的指量的指量的指针变针变量量量量2 2 6.3 6.3 数数数数组组的指的指的指的指针针和指向和指向和指向和指向数数数数组组的指的指的指的指针变针变量量量量3 3 6.4 6.4 字符串的指字符串的指字符串的指字符串的指针针和指向字符串的指和指向字符串的指和指向字符串的指和指向字符串的指针变针变量量量量4 4 6.5 6.5 函函函函数数数数的指的指的指的指针针和指向函和指向函和指向函和指向函数数数数的指的指的指的指针变针变量量量量5 5信息信息与与物流管理系物流管理系 在说明指针及指针变量之前,先简单举个例子,在座的在说明指针及指针变量之前,先简单举个例子,在座的每个同学,都住在集体宿舍,每个同学有一个名字,对应一每个同学,都住在集体宿舍,每个同学有一个名字,对应一个房间,那么,房号,就是该同学的地址,地址内的内容就个房间,那么,房号,就是该同学的地址,地址内的内容就是该同学,对于计算机而言,内存是存放数据的是该同学,对于计算机而言,内存是存放数据的,它也是以它也是以地址来识别的,而存放的数据,就是内存里面的内容。地址来识别的,而存放的数据,就是内存里面的内容。6.1 指针概念及定义指针概念及定义信息信息与与物流管理系物流管理系6.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量语法形式语法形式语法形式语法形式 存储类型存储类型 数据类型数据类型 *指针名初始地址;指针名初始地址;例:例:int*pa=&a;int*pa=&a;注意事项注意事项注意事项注意事项 用变量地址作为初值时,该变量必须在指针初始化之前已用变量地址作为初值时,该变量必须在指针初始化之前已说明过,且变量类型应与指针类型一致。说明过,且变量类型应与指针类型一致。可以用一个已赋初值的指针去初始化另一个指针变量。可以用一个已赋初值的指针去初始化另一个指针变量。不能用一个内部不能用一个内部 auto auto 型变量去初始化型变量去初始化 static static 型指针。型指针。变量的指针就是变量的地址变量的指针就是变量的地址指针变量就是存放指针值的那个变量,用指针变量就是存放指针值的那个变量,用“*”代表代表“指向指向”6.2.1 指针变量指针变量初始化初始化信息信息与与物流管理系物流管理系概念概念概念概念 指指针针:一个:一个变变量的地址量的地址,用于用于间间接接访问变访问变量量 指指针变针变量:量:用于存放地址的用于存放地址的变变量量定义定义定义定义例:例:int i;int i;int*i_pointer;int*i_pointer;指向整型指向整型变变量的指量的指针针引用引用引用引用例例1 1:i=3;i=3;例例2 2:*i_pointer=3;i_pointer=3;20003i_pointer*i_pointeri2000内存用户数据区内存用户数据区变量变量 i变量变量 j变量变量 i_pointer3620002000200230106.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量信息信息与与物流管理系物流管理系i=3 (两语句作用相同两语句作用相同)*i_pointer=3 pointer_5是指向实型变量的指针变是指向实型变量的指针变量量char*pointer_4=pointer_4是指向字符型变量的指针是指向字符型变量的指针两个关系运算符:两个关系运算符:&:取地址运算,取地址运算,&a为变量为变量a的地址的地址*:指针运算符,指针运算符,*p:指针变量指针变量p所指向的变量所指向的变量 *也称为也称为“间接访问间接访问”运算符运算符6.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量信息信息与与物流管理系物流管理系/*/*例例6-1.c*6-1.c*指针的概念指针的概念 *main()main()int a;int a;int*pa;int*pa;pa=&a;pa=&a;a=10;a=10;printf(a:%dn,a);printf(a:%dn,a);printf(*pa:%dn,*pa);printf(*pa:%dn,*pa);printf(printf(“&a:%x(HEX)n&a:%x(HEX)n”,&a);/*,&a);/*取取a a的地址的地址 /printf(pa:%x(HEX)n,pa);/*printf(pa:%x(HEX)n,pa);/*指针变量值指针变量值 /printf(&pa:%x(HEX)n,&pa);/*printf(&pa:%x(HEX)n,&pa);/*指针变量的地址指针变量的地址 /6.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量信息信息与与物流管理系物流管理系6.2.2 指指针变量的运算量的运算算术运算算术运算算术运算算术运算 指指针针与整数的加减运算与整数的加减运算 指指针针 p p 加上或减去加上或减去 n n,其意,其意义义是指是指针针当前指向位置的前方或后方第当前指向位置的前方或后方第 n n 个数据的地址。个数据的地址。这这种运算的种运算的结结果果值值取决于指取决于指针针指向的数据指向的数据类类型。型。指指针针加一,减一运算加一,减一运算指向下一个或前一个数据。指向下一个或前一个数据。例如:例如:y=*px+y=*px+相当于相当于 y=*(px+)(*y=*(px+)(*和和+优优先先级级相同,自右向左运相同,自右向左运算算)关系运算关系运算关系运算关系运算 指向相同指向相同类类型数据的指型数据的指针针之之间间可以可以进进行各种关系运算。行各种关系运算。指向不同数据指向不同数据类类型的指型的指针针,以及指,以及指针针与一般整型与一般整型变变量之量之间间的关系运算是的关系运算是无意无意义义的。的。指指针针可以和零之可以和零之间进间进行等于或不等于的关系运算。例如:行等于或不等于的关系运算。例如:p=0p=0或或p!=0p!=0赋值运算赋值运算赋值运算赋值运算 向指向指针变针变量量赋赋的的值值必必须须是地址常量或是地址常量或变变量,不能是普通整数。量,不能是普通整数。但可以但可以赋值为赋值为整数整数0 0,表示空指,表示空指针针。6.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量信息信息与与物流管理系物流管理系注意事项:注意事项:(1)&与与*计算的优先级相同计算的优先级相同&*pointer=先执行先执行*pointer,(先右后左先右后左)若若*pointer=a,则则&*pointer=&a(2)*&a=*(&a)=*pointer=a(3)(*pointer-1)+=a+括号不能少,否则变成括号不能少,否则变成 =*(pointer-1+)6.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量信息信息与与物流管理系物流管理系/*6-2.c*/*6-2.c*/*/*输入输入a a和和b b两个数,并由大到小输出两个数,并由大到小输出*/*/*本例中,指针变量的值改变了,本例中,指针变量的值改变了,a a和和b b并没有改变并没有改变*/main()main()int a,b,*pa,*pb,*p;int a,b,*pa,*pb,*p;scanf(%d,%d,&a,&b);scanf(%d,%d,&a,&b);pa=&a;pb=&b;pa=&a;pb=&b;if(ab)if(ab)p=pa;p=pa;pa=pb;pa=pb;pb=p;pb=p;printf(a=%d,b=%dn,a,b);printf(a=%d,b=%dn,a,b);printf(*pa=%d,*pb=%dn,*pa,*pb);printf(*pa=%d,*pb=%dn,*pa,*pb);6.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量信息信息与与物流管理系物流管理系/*/*例例 6-3.c*/6-3.c*/*/*本例中只改变变量值,指针变量值并没有改变本例中只改变变量值,指针变量值并没有改变,要求输入要求输入3 3个数个数*/*please compare it with that of 5-2.c/*please compare it with that of 5-2.c 由大到小排序输出由大到小排序输出*/main()main()int a,b,c,*pa,*pb,*pc;int a,b,c,*pa,*pb,*pc;scanf(%d,%d,%d,&a,&b,&c);scanf(%d,%d,%d,&a,&b,&c);pa=&a;pa=&a;pb=&b;pb=&b;pc=&c;pc=&c;exchange(pa,pb,pc);exchange(pa,pb,pc);printf(a=%d,b=%d,c=%dn,a,b,c);printf(a=%d,b=%d,c=%dn,a,b,c);printf(*pa=%d,*pb=%d,*pc=%dn,*pa,*pb,*pc);printf(*pa=%d,*pb=%d,*pc=%dn,*pa,*pb,*pc);exchange(q1,q2,q3)exchange(q1,q2,q3)int*q1,*q2,*q3;int*q1,*q2,*q3;if(*q1*q2)if(*q1*q2)swapswap(q1,q2);(q1,q2);if(*q1*q3)if(*q1*q3)swapswap(q1,q3);(q1,q3);if(*q2*q3)if(*q2*q3)swapswap(q2,q3);(q2,q3);swapswap(pa,pb)(pa,pb)int*pa,*pb;int*pa,*pb;int p;int p;p=*pa;*pa=*pb;*pb=p;p=*pa;*pa=*pb;*pb=p;6.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量信息信息与与物流管理系物流管理系6.3.1 通通过指指针引用数引用数组元素元素数组的指针就是数组的起始地址数组的指针就是数组的起始地址数组的指针就是数组的起始地址数组的指针就是数组的起始地址定义与赋值定义与赋值定义与赋值定义与赋值例:例:int a10;int a10;定定义义a a数数组组有有1010个元素个元素 int*pa;int*pa;定定义义papa为为指指针变针变量,整型量,整型 pa=&a0;pa=&a0;或或 pa=a;pa=a;把数把数组组a a的首地址的首地址赋给赋给papa通过指针引用数组元素通过指针引用数组元素通过指针引用数组元素通过指针引用数组元素经过经过上述定上述定义义及及赋值赋值后:后:*papa就是就是a0,*(pa+1)a0,*(pa+1)就是就是a1,.,*(pa+i)a1,.,*(pa+i)就是就是ai.ai.ai,*(pa+i),*(a+i),paiai,*(pa+i),*(a+i),pai都是等效的。都是等效的。不能写不能写 a+a+,因,因为为a a是数是数组组首地址是常量,不是首地址是常量,不是变变量。量。6.3 数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量信息信息与与物流管理系物流管理系/*/*例例6-4.c*6-4.c*把数组的首地址值赋给指针变量把数组的首地址值赋给指针变量*/*/*指针与数组的关系指针与数组的关系*/main()main()int a10,*pa,i;int a10,*pa,i;for(i=0;i10;i+)for(i=0;i10;i+)ai=i+1;/*ai=i+1;/*给数组赋初值给数组赋初值*/pa=a;/*pa=a;/*将数组首地址赋给将数组首地址赋给pa*/pa*/for(i=0;i10;i+)for(i=0;i10;i+)printf(*(pa+%d):%dn,i,*(pa+i);printf(*(pa+%d):%dn,i,*(pa+i);6.3 数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量信息信息与与物流管理系物流管理系/*/*例例*6-5.c*/6-5.c*/main()main()int*p,i,a10;int*p,i,a10;p=a;for(i=0;i10;i+)p=a;for(i=0;i10;i+)scanf(scanf(“%d%d”,p+);/*,p+);/*通过指针给数组元素赋值通过指针给数组元素赋值*/printf(n);printf(n);p=a;p=a;for(i=0;i10;i+,p+)for(i=0;i10;i+,p+)printf(%dn,*p);printf(%dn,*p);若把若把p+p+去掉,则打印时去掉,则打印时只打印第一个数,为何?只打印第一个数,为何?P+i所代表的地址实际上是所代表的地址实际上是p+i*d其中:其中:d2,整型整型2字节数字节数 d4,实型实型4字节数字节数 d1,字符型数字符型数6.3 数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量信息信息与与物流管理系物流管理系6.3.2数组名作函数参数数组名作函数参数函数调用前,形参数组不占内存,函数调用前,形参数组不占内存,函数调用时,实参数组的首地址作为形参数函数调用时,实参数组的首地址作为形参数组的首地址。组的首地址。main()int array10;:f(array,10);:数组名作数组名作函数参数函数参数f(arr,n)int arr,n;:6.3 数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量信息信息与与物流管理系物流管理系/*/*例例6-6.c*/6-6.c*/*/*将数组将数组a a中的中的n n个整数按相反顺序存放个整数按相反顺序存放*/*/*定义数组名作为函数参数,其中定义数组名作为函数参数,其中I I为第一、第二为第一、第二 ,j j为倒一、倒二为倒一、倒二*/*/*/*在主函数中,在主函数中,a a 是数组名,在是数组名,在invinv函数中,函数中,x x是函数参数是函数参数*/void inv(x,n)void inv(x,n)int*x,n;int*x,n;int*p,t,*i,*j,m=(n-1)/2;int*p,t,*i,*j,m=(n-1)/2;i=x;j=x+n-1;p=x+m;i=x;j=x+n-1;p=x+m;for(;i=p;i+,j-)for(;i=p;i+,j-)t=*i;*i=*j;*j=t;t=*i;*i=*j;*j=t;return;return;main()static int i,a10=13,47,69,111,10,66,77,95,44,21;main()static int i,a10=13,47,69,111,10,66,77,95,44,21;printf(The original array:n);printf(The original array:n);for(i=0;i10;i+)for(i=0;i10;i+)printf(%d,ai);printf(%d,ai);inv(a,10);/*inv(a,10);/*此处数组名此处数组名a a作为函数参数作为函数参数*/printf(The array has been inverted:n);printf(The array has been inverted:n);for(i=0;i10;i+)for(i=0;i*(a+0)+1=&a01a1+2=*(a+1)+2=&a12-不能写成不能写成*(a+1+2)6.3 数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量信息信息与与物流管理系物流管理系(2)多维数组的指针多维数组的指针对于二维数组,指向某个特定的对于二维数组,指向某个特定的anm,计算计算aij在数组中在数组中的相对的相对位置的公式为:位置的公式为:i*m+j ,m为数组的列数。为数组的列数。如如a34:a23=*(p+2*4+3)=*(p+11)p为指针变量。为指针变量。A)指向数组元素的指针变量指向数组元素的指针变量 例:例:static int a12=1,2;int*P;for(P=a0;Pa0+2;P+)B)指向由指向由m个整数组成的一维数个整数组成的一维数组的指针变量组的指针变量 例:例:static int a12=1,2;int(*p)4,i,j;p=a;int(*p)4表明表明p是一个指针变量,是一个指针变量,它指向包含它指向包含4个元素的一维数组,个元素的一维数组,若写成若写成*p4,则表明是指针数组则表明是指针数组(随后再讲)(随后再讲)C)多维数组的指针作函数参数多维数组的指针作函数参数 多维数组的地址也可以作函数参数传多维数组的地址也可以作函数参数传递递6.3 数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量信息信息与与物流管理系物流管理系/*/*例例6-7.c 6-7.c 求学生成绩的平均值求学生成绩的平均值*/main()main()void average();void average();static float static float scorescore34=60,61,62,63,70,71,72,73,80,81,82,83;34=60,61,62,63,70,71,72,73,80,81,82,83;averageaverage(scorescore,12);,12);void void averageaverage(p,n)(p,n)float*p;int n;float*p;int n;float*p_end;float*p_end;float sum=0,aver;float sum=0,aver;p_end=p+n-1;p_end=p+n-1;for(;p=p_end;p+)for(;py)z=x;if(xy)z=x;else z=y;else z=y;return(z);return(z);min(int x,int y)min(int x,int y)int z;int z;if(xy)z=x;if(x f1=1+x2 f2=1+x+x2+x3 f3=x/(1+x2)例:例:6-10.C 求定积分求定积分6.5 函数的指针和指向函数的指针变量函数的指针和指向函数的指针变量信息信息与与物流管理系物流管理系/*/*例例6-10.c*6-10.c*利用指向函数的指针变量的特性,求解定积分利用指向函数的指针变量的特性,求解定积分*/float integral(fun,a,b)float integral(fun,a,b)float(*fun)(),a,b;/*fun float(*fun)(),a,b;/*fun 为指向函数的指针变量为指向函数的指针变量*/float s,h,y;float s,h,y;int n,i;int n,i;s=(*fun)(a)+(*fun)(b)/2.0;s=(*fun)(a)+(*fun)(b)/2.0;n=100;n=100;h=(b-a)/n;h=(b-a)/n;for(i=1;in;i+)for(i=1;in;i+)s=s+(*fun)(a+i*h);s=s+(*fun)(a+i*h);y=s*h;y=s*h;return(y);return(y);main()main()float f1(),f2(),f3(),integral();float f1(),f2(),f3(),integral();float a,b,y1,y2,y3;float a,b,y1,y2,y3;y1=integral(y1=integral(f1f1,0.0,1.0);,0.0,1.0);y2=integral(y2=integral(f2f2,0.0,2.0);,0.0,2.0);y3=integral(y3=integral(f3f3,0.0,3.5);,0.0,3.5);printf(y1=%6.2fny2=%6.2fny3=%6.2fn,y1,y2,y3);printf(y1=%6.2fny2=%6.2fny3=%6.2fn,y1,y2,y3);float f1(float x)float f1(float x)float f;float f;f=1+x;f=1+x;return(f);return(f);float f2(float x)float f2(float x)float f;float f;f=1+x+x*x+x*x*x;f=1+x+x*x+x*x*x;return(f);return(f);float f3(float x)float f3(float x)float f;float f;f=x/(1+x*x);f=x/(1+x*x);return(f);return(f);6.5 函数的指针和指向函数的指针变量函数的指针和指向函数的指针变量信息信息与与物流管理系物流管理系6.6 返回指针值的函数返回指针值的函数格式:类型标识符格式:类型标识符 *函数名函数名(参数表参数表)如:如:int*a(x,y)与上一节不同,注意比较。与上一节不同,注意比较。显然这是一个指针型函数,显然这是一个指针型函数,函数值是指针,因此称作返函数值是指针,因此称作返回指针值的函数。回指针值的函数。信息信息与与物流管理系物流管理系/*/*例例 6-11.c*/6-11.c*/*/*有若干个学生,每个学生有有若干个学生,每个学生有4 4门课,要求在输入学生序号以后,输出门课,要求在输入学生序号以后,输出*/*/*该学生的该学生的*/*/*全部成绩,用指针函数来实现全部成绩,用指针函数来实现*/main()main()static float score4=60,70,80,90,56,66,76,86,34,44,54,64;static float score4=60,70,80,90,56,66,76,86,34,44,54,64;float*search();/*float*search();/*返回指针值的函数,其数值就是指针,因此称指针值的函数返回指针值的函数,其数值就是指针,因此称指针值的函数*/float*p;int i,float*p;int i,m m;/*;/*m m是要查找的学生的学号是要查找的学生的学号*/printf(Enter the number of the student(less then 3):);printf(Enter the number of the student(less then 3):);scanf(%d,&m);scanf(%d,&m);printf(The score of No.%d are:n,m);printf(The score of No.%d are:n,m);p=p=searchsearch(score,(score,m m);/*score);/*score为指向行的指针,不是列为指向行的指针,不是列*/for(i=0;i4;i+)for(i=0;i4;i+)printf(%5.2fn,*(p+i);printf(%5.2fn,*(p+i);float*search(pointer,n)float*search(pointer,n)float(*pointer)4;/*float(*pointer)4;/*指向包含指向包含4 4个元素的一维数组的指针变量个元素的一维数组的指针变量*/int n;int n;float*pt;float*pt;pt=*(pointer+n);/*pt=*(pointer+n);/*指向指向scorescore数组第数组第n n行行*/return(pt);return(pt);6.6 返回指针值的函数返回指针值的函数信息信息与与物流管理系物流管理系6.7指针数组和指向指针的指针指针数组和指向指针的指针概念:指针数组,其元素均为指针类型数据。概念:指针数组,其元素均为指针类型数据。格式:类型标识格式:类型标识*函数名函数名数组长度说明数组长度说明如如 int*pointer5 注意不要写成注意不要写成 int(*pointer)5由于字符串本身就是一个字符数组,因此要设计一个二维的字符数组才由于字符串本身就是一个字符数组,因此要设计一个二维的字符数组才能存放各个字符串,但字符串的长度是不一样的,这样就容易造成内存能存放各个字符串,但字符串的长度是不一样的,这样就容易造成内存浪费,于是可以分别定义一些字符串,然后用指针数组中的元素分别指浪费,于是可以分别定义一些字符串,然后用指针数组中的元素分别指向各字符串,如果希望对字符串排序,只要改变指针数组中元素的指向向各字符串,如果希望对字符串排序,只要改变指针数组中元素的指向就可以,这些值是字符串的首地址。就可以,这些值是字符串的首地址。指针数组便于处理多个不同长度的字符串指针数组便于处理多个不同长度的字符串6.7.1指针数组的概念指针数组的概念信息信息与与物流管理系物流管理系/*/*例例 6-12.c*6-12.c*指针数组的应用指针数组的应用*/main()main()int b23,*pb2;/*pb2 int b23,*pb2;/*pb2是指针数组是指针数组*/int i,j;/*int i,j;/*与与*a(x,y)a(x,y)不一样,它是返回指针的函数不一样,它是返回指针的函数*/for(i=0;i2;i+)for(i=0;i2;i+)for(j=0;j3;j+)for(j=0;j3;j+)bij=(i+1)*(j+1);/*bij=(i+1)*(j+1);/*赋值赋值*/pb0=b0;/*pb0=b0;/*指针数组的初始化指针数组的初始化*/pb1=b1;/*pb1=b1;/*指针数组的初始化指针数组的初始化*/for(i=0;i2;i+)for(i=0;i2;i+)for(j=0;j3;j+,*pbi+)for(j=0;j3;j+,*pbi+)printf(b%d%d:%2dn,i,j,*pbi);printf(b%d%d:%2dn,i,j,*pbi);6.7指针数组和指向指针的指针指针数组和指向指针的指针信息信息与与物流管理系物流管理系/*/*例例 6-13.c*6-13.c*指针数组的初始化指针数组的初始化*/main()main()static int b23 static int b23 static int*pb=b0,b1;/*pb static int*pb=b0,b1;/*pb是指针数组是指针数组*/int i,j;/*int i,j;/*与与*a(x,y)a(x,y)不一样,它是返回指针的函数不一样,它是返回指针的函数*/for(i=0;i2;i+)for(i=0;i2;i+)for(j=0;j3;j+)for(j=0;j3;j+)*(bi+j)=(i+1)*(j+1);/*(bi+j)=(i+1)*(j+1);/*赋值赋值*/for(i=0;i2;i+)for(i=0;i2;i+)for(j=0;j3;j+,*pbi+)for(j=0;j3;j+,*pbi+)printf(b%d%d:%2dn,i,j,*pbi);printf(b%d%d:%2dn,i,j,*pbi);6.7指针数组和指向指针的指针指针数组和指向指针的指针信息信息与与物流管理系物流管理系/*/*例例6-14.c*6-14.c*用指针数组处理多个字符串用指针数组处理多个字符串,并按字母顺序由小到大排列并按字母顺序由小到大排列*/main()main()void sort();void sort();void print();void print();static char*name=static char*name=Tsinghua,Tsinghua,Beijing Univ,Beijing Univ,Peoples Univ;Peoples Univ;int n=3;int n=3;sortsort(name,n);(name,n);printprint(name,n);(name,n);指针数组指针数组nameknamek和和namejnamej分别是第分别是第k k和和j j个字个字符串的起始地址,符串的起始地址,若若nameknamek所指字所指字符串大符串大amejamej所指所指字符串,则函数为字符串,则函数为正值,相等为正值,相等为0 0,小于则为负值小于则为负值void sort(name,n)void sort(name,n)char*name;char*name;int n;int n;char*t;/*char*t;/*定义中间定义中间指针变量指针变量*/int i,j,k;int i,j,k;for(i=0;in-1;i+)for(i=0;in-1;i+)k=i;k=i;for(j=i+1;jn;j+)for(j=i+1;j0)k=j;if(strcmp(namek,namej)0)k=j;if(k!=i)if(k!=i)t=namei;namei=namek;namek=t;t=namei;namei=namek;namek=t;运行结果如下:运行结果如下:Beijing UnivBeijing UnivPeoples UnivPeoples UnivTsinghuaTsinghuavoid print(name,n)void print(name,n)char*name;char*name;int n;int n;int i;int i;for(i=0;in;i+)for(i=0;in;i+)printf(%sn,namei);printf(%sn,namei);6.7指针数组和指向指针的指针指针数组和指向指针的指针信息信息与与物流管理系物流管理系6.7.2指向指针的指针指向指针的指针(针对指针数组针对指针数组)注意字符数组与变量数组的不同赋值方法。注意字符数组与变量数组的不同赋值方法。*p是指向是指向p间接指向的对象的地址。间接指向的对象的地址。*p是间接指向对象的值。是间接指向对象的值。如如name是一个数组,其每一是一个数组,其每一元素都有相应的地址,数组元素都有相应的地址,数组名名name就是指针数组的首地就是指针数组的首地址,再设计一个指针变量址,再设计一个指针变量P,指向指针数组内的元素,则指向指针数组内的元素,则P就是指针数组的指针变量就是指针数组的指针变量。name32104EDCBA6.7指针数组和指向指针的指针指针数组和指向指针的指针信息信息与与物流管理系物流管理系多级指针多级指针指向指针的指针亦称为二级指针指向指针的指针亦称为二级指针指向指针的指针亦称为二级指针指向指针的指针亦称为二级指针 说明形式:说明形式:存储类型存储类型 数据类型数据类型 *指针名指针名如:如:char*pchar*p 它相当于它相当于*(*(*p)p)*p:*p:说明是指向字符数据的指针变量说明是指向字符数据的指针变量 *:说明是指向指针变量的变量:说明是指向指针变量的变量6.7指针数组和指向指针的指针指针数组和指向指针的指针信息信息与与物流管理系物流管理系/*/*例例 6-15 6-15 用多级指针处理多个字符串用多级指针处理多个字符串*/#define NULL 0#define NULL 0main()main()static a5=1,3,5,7,9;static a5=1,3,5,7,9;static int*num5=&a0,&a1,&a2,&a3,&a4;static int*num5=&a0,&a1,&a2,&a3,&a4;static char*name=static char*name=Tsinghua,Tsinghua,PKU,PKU,/*,/*空串,只有一个空串,只有一个00,表示结束,表示结束,“”中不能有空格中不能有空格*/PEOPLEs UNIV,PEOPLEs UNIV,;/*;/*空串,只有一个空串,只有一个00,表示结束,表示结束,“”中不能有空格中不能有空格*/int*p,i;/*pint*p,i;/*p是指向是指向p p的对象的地址的对象的地址*/char*pp;/*pchar*pp;/*p是指向是指向p p对象的值对象的值*/p=num;p=num;6.7指针数组和指向指针的指针指针数组和指向指针的指针信息信息与与物流管理系物流管理系for(i=0;i5;i+)for(i=0;i1)/*if argc0,what would happen?*/while(argc1)/*if argc0,what would happen?*/+argv;/*+argv;/*第一个参数是程序名,跳过不取,第一个参数是程序名,跳过不取,若把此行移到若把此行移到printf,printf,将会怎样将会怎样*/printf(%sn,*argv);printf(%sn,*argv);-argc;-argc;6.7指针数组和指向指针的指针指针数组和指向指针的指针信息信息与与物流管理系物流管理系/*/*例例6-17.c 6-17.c 在同一行输出命令行参数在同一行输出命令行参数*/main(argc,argv)main(argc,argv)int argc;int argc;char*argv;char*argv;/*modify this line as while(argc-0),what happen?*/*modify this line as while(argc-0),what happen?*/while(-argc0)while(-argc0)/*argv/*argv先增值,跳过程序名先增值,跳过程序名*/printf(%s%c,*+argv,(argc1)?:n);printf(%s%c,*+argv,(argc1)?:n);6.7指针数组和指向指针的指针指针数组和指向指针的指针信息信息与与物流管理系物流管理系6.8 指指针小小结定义定义定义定义 int *p;int *p;指向整型量的指指向整型量的指针针 int *p;int *p;指指针针数数组组,每个元素指向整形量,每个元素指向整形量 int (*p);int (*p);一个指一个指针针,指向一,指向一维维整形数整形数组组 int *p();int *p();一个函数,返回指向整形的指一个函数,返回指向整形的指针针 int (*p)();int (*p)();一个指一个指针针,指向返回,指向返回值为值为整型数的函数整型数的函数 int *p;int *p;二二级级指指针针。指针在使用前一定要赋值指针在使用前一定要赋值指针在使用前一定要赋值指针在使用前一定要赋值优缺点:优缺点:优缺点:优缺点:快速灵活、- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法语言 数据结构
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【快乐****生活】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【快乐****生活】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【快乐****生活】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【快乐****生活】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文