C程序设计 第6章_第1页
C程序设计 第6章_第2页
C程序设计 第6章_第3页
C程序设计 第6章_第4页
C程序设计 第6章_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

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

文档简介

C语言程序设计第6章指针第1章C语言概述第2章基本数据类型和运算第3章结构化程序设计第5章函数第6章指针第7章复合结构类型第8章编译预处理第4章数组及字符串●课程概述

附录6.1指针的基本概念 6.2指针变量的运算6.3指向数组元素的指针6.4指向多维数组的指针变量6.5指向字符串的指针变量6.6 指针型函数6.7 指针数组6.8 二级指针6.9

程序举例6.10

用指针进行内存动态分配6.11

指针数据类型的总结

第9章位运算第10章文件指针第6章教学目标►掌握指针的概念和运算规则►掌握用指针访问变量、一维数组和二维数组►用指针处理字符串的方法6.1.1指针和指针变量6.1指针的基本概念1.指针的概念

2.指针变量内存单元的编号叫做地址,通常也把这个地址称为“指针”。6.1.1指针和指针变量6.1指针的基本概念1.指针的概念

2.指针变量在C语言中,允许用一个变量来存放指针,这种变量称为“指针变量”。6.1.2指针变量的定义1.定义的一般格式

2.举例说明6.1指针的基本概念[存储类型]类型说明符*变量名;其中,“*”表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。一个指针变量只能指向同一种类型的变量,也就是说,不能定义一个既指向一个整型变量又指向一个双精度型变量的指针变量。6.1.2指针变量的定义1.定义的一般格式

2.举例说明6.1指针的基本概念例如:int*m1;表示m1是一个指针变量,它的值是某个整型变量的地址;或者说m1指向一个整型变量。至于m1究竟指向哪一个整型变量,应该由指向m1赋予的地址来决定。再例如:staticint*m2;/*m2是指向静态整型变量的指针变量*/float*m3;/*m3是指向浮点型变量的指针变量*/char*m4;/*m4是指向字符型变量的指针变量*/6.1.3指针变量赋值1.变量地址表示方法

2.给指针变量赋地址的方法C语言提供了地址运算符“&”,表示变量地址的一般形式为:&变量名;如:&a表示变量a的地址,&b表示变量b的地址。6.1指针的基本概念3.例6.16.1.3指针变量赋值1.变量地址表示方法

(1)指针变量初始化的方法。inta;/*定义整型变量a*/int*p=&a;/*定义指针p,并将变量a的地址赋给指针p*/(2)赋值语句的方法。inta;/*定义整型变量a*/int*p;/*定义指针p*/p=&a;/*将变量a的地址赋给指针p*/6.1指针的基本概念2.给指针变量赋地址的方法3.例6.16.1.3指针变量赋值1.变量地址表示方法

【例6.1】用指针变量访问变量中的数据。#include<stdio.h>main(){ inta,*p;/*定义整型变量a和整型变量指针p*/ p=&a;/*指针p指向变量a*/

printf("pleaseenteranumber:\n",*p);

scanf("%d",p);/*为指针p所指的存储单元输入数值*/

printf("%d\n",*p);/*输出指针p所指的存储单元的内容*/}6.1指针的基本概念2.给指针变量赋地址的方法3.例6.11501000ap1000

10012000

20012.取内容运算符*3.注意事项取地址运算符“&”是单目运算符,其结合性为自右至左,功能是取变量的地址。在scanf函数中,我们已经认识并使用了&运算符。1.取地址运算符&6.2.1指针运算符6.2指针变量的运算2.取内容运算符*3.注意事项取内容运算符“*”是单目运算符,其结合性为自右至左,通过“*”可以存取指针所指的存储单元的内容。在“*”运算符之后跟的变量必须是指针变量。需要注意的是指针运算符“*”和指针变量说明中的指针说明符“*”不是一回事。在指针变量说明中,“*”是类型说明符,表示其后的变量是指针类型。而表达式中出现的“*”则是一个运算符,用以表示指针变量所指的内容。1.取地址运算符&6.2.1指针运算符6.2指针变量的运算2.取内容运算符*3.注意事项【例6.2】分析下面程序的运行结果。#include<stdio.h>main(){ int

d,x,*p;/*定义整型变量d、x和整型指针p*/ d=10; x=19; p=&x;/*将变量x的地址赋给指针p*/

printf("d=%d\n",*p);}1.取地址运算符&6.2.1指针运算符6.2指针变量的运算程序的运行结果如下:d=192.取内容运算符*3.注意事项(1)取地址运算符&表示变量的地址;而取内容运算符*表示指针所指的内容。(2)运算符&只能用于变量和数组元素。(3)*和&都是单目运算符,两者的优先级相同,结合性均是从右到左。(4)&x不能出现在赋值号的左边。(5),因此不能用&取寄存器变量的地址。(6)被赋值的指针变量前不能再加“*”说明符,如写为*p=&a也是错误的。1.取地址运算符&6.2.1指针运算符6.2指针变量的运算2.取内容运算符*3.注意事项【例6.3】通过指针变量访问字符型变量。#include<stdio.h>main(){charch1,ch2;/*定义字符型变量ch1和ch2*/char*p1,*p2;/*定义字符型指针p1和p2*/ch1='A';ch2='B';p1=&ch1;/*指针p1指向变量ch1*/p2=&ch2;/*指针p2指向变量ch2*/printf("%c,%c\n",ch1,ch2);/*输出变量ch1和变量ch2的内容*/

printf("%c,%c",*p1,*p2);/*输出指针p1和p2所指的存储单元的内容*/}1.取地址运算符&6.2.1指针运算符6.2指针变量的运算程序的运行结果为:A,BA,B&ch1&ch2P1P2ch1ch2(a)p1与ch1之间的关系(b)p2与ch2之间的关系2.指针中加减运算3.指针变量的关系运算(1)指针变量初始化赋值时,不要将一个内存地址常量赋给一指针变量。例如:inti=100,x;int*m;:m=&i;1.赋值运算6.2.2指针变量的运算6.2指针变量的运算4.两指针变量相减2.指针中加减运算3.指针变量的关系运算(2)指针变量和一般变量一样,存放在其中的值是可以改变的,也就是说可以改变指针变量的指向,例如:inti,j;int*p1;int*p2;i='c';j='d';p1=&i;p2=&j;上面的程序语句也可以用下面的图来说明。1.赋值运算6.2.2指针变量的运算6.2指针变量的运算赋值运算结果4.两指针变量相减2.指针中加减运算3.指针变量的关系运算如果此时有如下的赋值表达式:p2=p1;则指针变量p2与p1就指向了同一个对象i,此时的*p2就等价于i,而不再是j了,这种情况可以用如下的图来说明。1.赋值运算6.2.2指针变量的运算6.2指针变量的运算p2=p1时的情形P1P24.两指针变量相减2.指针中加减运算3.指针变量的关系运算再例如,如果执行如下的表达式:*p2=*p1;则此时表示把p1指向的内容赋给p2所指的区域,此时可用下图来表示情形。1.赋值运算6.2.2指针变量的运算6.2指针变量的运算*p2=*p1时的情形P1P24.两指针变量相减2.指针中加减运算3.指针变量的关系运算(3)如果需要,也可以把数组的首地址赋予指向数组的指针变量。例如:inta[8],*pa;pa=a;也可写为:pa=&a[0];也可采取如下初始化赋值的方法:inta[8],*pa=a;1.赋值运算6.2.2指针变量的运算6.2指针变量的运算4.两指针变量相减2.指针中加减运算3.指针变量的关系运算(4)可以把字符串的首地址赋给指向字符类型的指针变量。例如,把字符串“Hellohuman”赋给指针变量p,方法如下:char*p;p="Hellohuman";或用初始化赋值的方法写为:char*p="Hellohuman";1.赋值运算6.2.2指针变量的运算6.2指针变量的运算4.两指针变量相减2.指针中加减运算3.指针变量的关系运算对于指向数组的指针变量,可以给其加上或减去一个整数n。例如,设p是指向数组m的指针变量,则p+n,p-n,p++,++p,p--,--p都是合法的运算表达式。给指针变量加上或减去一个整数n表示把指针指向的当前位置(指向某数组元素)向前或向后移动n个位置。1.赋值运算6.2.2指针变量的运算6.2指针变量的运算4.两指针变量相减2.指针中加减运算3.指针变量的关系运算指向同一数组的两个指针变量进行关系运算可表示它们所指数组元素之间的关系。例如:p1==p2;/*表示p1和p2指向同一数组元素*/p1>p2;/*表示p1处于高地址位置*/p1<p2;/*表示p2处于高地址位置*/1.赋值运算6.2.2指针变量的运算6.2指针变量的运算4.两指针变量相减2.指针中加减运算3.指针变量的关系运算4.两指针变量相减【例6.4】一个关于指针变量关系运算的例子。main(){ int

x,y,z,*max,*min; printf("pleaseinputthreenumbers:\n");

scanf("%d,%d,%d",&x,&y,&z); if(x>y)/*三个数进行大小比较*/ {max=&x;min=&y;}

else{max=&y;min=&x;}

if(z>*max)max=&z;

if(z<*min)min=&z;

printf("themaxis:%d\ntheminis:%d\n",*max,*min);}1.赋值运算6.2.2指针变量的运算6.2指针变量的运算该程序的运行结果如下:pleaseinputthreenumbers:233465↙themaxis:65theminis:232.指针中加减运算4.两指针变量相减两指针变量也可以进行相减运算,其所得之差是:两个指针所指的数组元素之间相差的元素个数,实际上是两个指针值(地址)相减之差再除以该数组元素的长度(字节数)。例如:p1和p2是指向同一整型数组的两个指针变量,设p1的值为1100H,p2的值为1050H,由于整型数组每个元素占2个字节,所以p1-p2的结果为(1100H-1050H)/2=25,因此“p1-p2”表示p1和p2之间相差25个元素。但是,p1和p2不能进行加法运算,因为指针变量相加是毫无意义的。1.赋值运算6.2.2指针变量的运算6.2指针变量的运算3.指针变量的关系运算2.数组指针变量的说明3.数组名和数组指针变量作函数参数第一,一个数组是由连续的一块内存单元组成的。其中的数组名就是这块连续内存单元的首地址。第二,一个数组也是由各个数组元素组成的。第三,数组元素的首地址也是指它所占有的几个内存单元的首地址。1.几个数组指针变量的关系6.3指向数组元素的指针2.数组指针变量的说明3.数组名和数组指针变量作函数参数数组指针变量说明的一般形式为:类型说明符*指针变量名;其中,“类型说明符”表示指针变量所指数组的类型;“*”表示其后的变量是指针变量。用数组指针变量访问数组元素有两种方法:第一种方法为下标法,即用m[i]形式访问数组元素。第二种方法为指针法,即采用*(pm+i)形式,该方法是用间接访问的方法来访问数组元素。1.几个数组指针变量的关系6.3指向数组元素的指针2.数组指针变量的说明3.数组名和数组指针变量作函数参数【例6.6】采用指针法访问数组元素。#include<stdio.h>main(){ intm[5],i,*pm; pm=m;

for(i=0;i<5;i++) {*pm=i;pm++;} pm=m;

for(i=0;i<5;i++) {printf("m[%d]=%d\n",i,*pm); pm++;}}1.几个数组指针变量的关系6.3指向数组元素的指针该程序的运行结果如下:m[0]=0m[1]=1m[2]=2m[3]=3m[4]=42.数组指针变量的说明3.数组名和数组指针变量作函数参数【例6.7】与例6.6的本意相同,但是其实现方式不同。#include<stdio.h>main(){

intm[5],i,*pm=m;

for(i=0;i<5;){*pm=i;

printf("m[%d]=%d\n",i++,*pm++);

}}1.几个数组指针变量的关系6.3指向数组元素的指针该程序的运行结果如下:m[0]=0m[1]=1m[2]=2m[3]=3m[4]=42.数组指针变量的说明3.数组名和数组指针变量作函数参数数组名是数组的首地址,实参向形参传送数组名实际上就是传送数组的地址,形参得到该地址后也指向同一数组。指针变量的值也是地址,数组指针变量的值即为数组的首地址,也可作为函数的参数使用。1.几个数组指针变量的关系6.3指向数组元素的指针2.数组指针变量的说明3.数组名和数组指针变量作函数参数【例6.8】编写求五门课程平均成绩的函数,并编写主函数调用该函数。下图所示为对应的N-S流程图。1.几个数组指针变量的关系6.3指向数组元素的指针定义浮点型的数组sco[5]、变量av

和指针*spsp=scofor(i=0;i<5;i++)将5门课程的成绩依次输入到sco[i]中av=aver(sp)输出平均分av的值main函数的N-S流程图定义浮点型变量av和sfor(i=0;i<5;i++)s=s+*pm++av=s/5返回av的值aver函数的N-S流程图2.数组指针变量的说明3.数组名和数组指针变量作函数参数程序代码如下:#include<stdio.h>floataver(float*pm);main(){

floatsco[5],av,*sp;

inti;

sp=sco;

printf("\npleaseinput5scores:\n");

for(i=0;i<5;i++)scanf("%f",&sco[i]);

av=aver(sp);

printf("averagescoreis%5.2f",av);

}floataver(float*pm)/*函数aver*/{

inti;

floatav,s=0;

for(i=0;i<5;i++)s=s+*pm++;

av=s/5;returnav;}1.几个数组指针变量的关系6.3指向数组元素的指针程序的运行结果如下:pleaseinput5scores:90455680100↙averagescoreis74.206.4指向二维数组的指针变量1.二维数组地址的表示方法

2.二维数组的指针变量C语言允许把一个二维数组分解为多个一维数组来处理。因此二维数组m可分解为三个一维数组,即m[0]、m[1]、m[2]。每个一维数组又含有四个元素。例如m[0]数组,含有m[0][0]、m[0][1]、m[0][2]、m[0][3]四个元素。6.4指向二维数组的指针变量1.二维数组地址的表示方法

2.二维数组的指针变量【例6.9】用不同的方式输出同一数组元素的数据值的应用举例。#include<stdio.h>main(){intm[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};

printf("%d,%d,%d,%d,%d,\n",m,*m,m[0],&m[0],&m[0][0]);printf("%d,%d,%d,%d,%d,\n",m+1,*(m+1),m[1],&m[1],&m[1][0]);printf("%d,%d,%d,%d,%d,\n",m+2,*(m+2),m[2],&m[2],&m[2][0]);printf("%d,%d\n",m[1]+1,*(m+1)+1);

printf("%d,%d\n",*(m[1]+1),*(*(m+1)+1));}其运行结果如下:404,404,404,404,404412,412,412,412,412420,420,420,420,420414,4145,56.4指向二维数组的指针变量1.二维数组地址的表示方法

2.二维数组的指针变量二维数组指针变量说明的一般形式为:

类型说明符(*指针变量名)[长度];其中“类型说明符”为所指数组的数据类型。“*”表示其后的变量是指针类型。“长度”表示二维数组分解为多个一维数组时,一维数组的长度,也就是二维数组的列数。“*(p+i)+j”是二维数组i行j列的元素的地址,而“*(*(p+i)+j)”则是i行j列元素的值。6.4指向二维数组的指针变量1.二维数组地址的表示方法

2.二维数组的指针变量【例6.10】二维数组指针变量的应用举例。main(){staticintm[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};

int(*p)[4];

int

i,j;p=m;

for(i=0;i<3;I

for(j=0;j<4;j++)printf("%3d",*(*(p+i)+j));}该程序的运行结果为:012345678910116.5指向字符串的指针变量1.字符串的表示形式2.字符串指针变量与字符数组的区别在C语言中,可以用两种方法访问一个字符串。(1)第一种:用字符串指针指向一个字符串。(2)第二种:用字符数组存放一个字符串,然后输出该字符串。6.5指向字符串的指针变量1.字符串的表示形式2.字符串指针变量与字符数组的区别【例6.11】编程实现:把一个字符串的内容复制到另一个字符串中,要求不能使用strcpy函数。函数cprstr的形参为两个字符指针变量pm和pn。其中,pm指向源字符串,pn指向目标字符串。这里要注意表达式“(*pn=*pm)!='\0'”的用法。程序代码如下:#include<stdio.h>cprstr(char*pm,char*pn)/*定义字符串复制函数cpystr*/{while((*pn=*pm)!='\0') { pn++; pm++; }}6.5指向字符串的指针变量1.字符串的表示形式2.字符串指针变量与字符数组的区别main(){ char*pa="Human",b[10],*pb;

pb=b;

cprstr(pa,pb);/*调用字符串复制函数cpystr*/

printf("string_a=%s\nstring_b=%s\n",pa,pb);}程序的输出结果为:string_a=Humanstring_b=Human6.5指向字符串的指针变量1.字符串的表示形式2.字符串指针变量与字符数组的区别简化后的程序如下所示:#include<stdio.h>cprstr(char*pm,char*pn){

while((*pn++=*pm++)!='\0');}main(){ char*pa="Human",b[10],*pb;

pb=b;

cprstr(pa,pb); printf("string_a=%s\nstring_b=%s\n",pa,pb);}程序的输出结果为:string_a=Humanstring_b=Human6.5指向字符串的指针变量1.字符串的表示形式2.字符串指针变量与字符数组的区别(1)在对字符数组作初始化赋值时,必须采用外部类型或静态类型。(2)字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中,并以'\0'作为串的结束。(3)字符串指针方式可以根据需要灵活使用。例如,对字符串指针方式:char*m="HelloHuman";可以改写为另一种方式:char*m;m="HelloHuman";6.6.1指针型函数的定义方法1.定义的一般形式

2.例6.12

6.6指针型函数类型说明符*函数名(形参表){

函数体}其中函数名之前加了“*”号表明这是一个指针型函数,即返回值将是一个指针。类型说明符表示了返回的指针值所指向的数据类型。6.6.1指针型函数的定义方法1.定义的一般形式

2.例6.12

6.6指针型函数【例6.12】使用指针函数编写程序,实现求两个数中的较大者。#include<stdio.h>int*max(int

a,intb){ int*p;

if(a>b) p=&a; else p=&b; returnp;}main(){

printf("max=%d",*(max(12,56)));}6.6.2函数指针变量1.一般形式

2.例6.13

6.6指针型函数类型说明符(*指针变量名)();上面就是函数指针变量定义的一般形式,其中“类型说明符”表示被指函数的返回值的类型。“(*指针变量名)”表示“*”后面的变量是定义的指针变量。最后的空括号表示指针变量所指的是一个函数。例如:

int(*f1)();表示f1是一个指向函数入口的指针变量,该函数的返回值是整型。3.几点注意事项

6.6.2函数指针变量1.一般形式

2.例6.13

6.6指针型函数【例6.13】编程实现:求两个整数中的较小者,在程序中使用指针形式实现对函数的调用。#include<stdio.h>int

min(int

a,intb){ if(a<b)returna; elsereturnb;}main(){ int

min(int

a,intb);

int(*pmin)();

int

x,y,z;

pmin=min;

printf("pleaseinputtwonumbers:\n");

scanf("%d%d",&x,&y); z=(*pmin)(x,y); printf("min_number=%d",z);}程序的运行情况为:pleaseinputtwonumbers:35↙23↙min_number=233.几点注意事项

6.6.2函数指针变量1.一般形式

2.例6.13

6.6指针型函数(1)函数调用中“(*指针变量名)”两边的括号不可少,其中的“*”不应该理解为求值运算,在此处它只是一种表示符号。(2)不能让函数指针变量参与算术运算,这是与数组指针变量不同的。应该特别注意的是:函数指针变量和指针型函数这两者在写法和意义上是有区别的。例如,float(*p)()和float*p()是两个完全不同的概念,3.几点注意事项

6.7指针数组1.指针数组的定义2.指针数组中的字符串指针数组定义的一般形式为:类型说明符*数组名[数组长度说明]例如:int*p[3];定义了一个有三个元素的指针数组,每个数组元素(指针变量)都可以指向一个整型变量。6.7指针数组1.指针数组的定义2.指针数组中的字符串【例6.14】指针数组应用举例。intm[3][3]={1,2,3,4,5,6,7,8,9};int*pm[3]={m[0],m[1],m[2]};int*p=m[0];main(){inti;

for(i=0;i<3;i++) printf("%d,%d,%d\n",m[i][2-i],*m[i],*(*(m+i)+i));

for(i=0;i<3;i++)

printf("%d,%d,%d\n",*pm[i],p[i],*(p+i));}该程序的运行结果如下:3,1,15,4,57,7,91,1,14,2,27,3,36.7指针数组1.指针数组的定义2.指针数组中的字符串指针数组也常用来表示一组字符串,这时指针数组的每个元素被赋予一个字符串的首地址。指向字符串的指针数组的初始化更为简单。例如,采用指针数组来表示一组字符串,其初始化赋值如下:char*p[]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};完成这个初始化赋值之后,p[0]即指向字符串“Monday”,……,p[6]指向“Sunday”。6.8.1一级指针和二级指针的概念6.8二级指针一级指针是直接指向数据对象的指针,即其中存放的是数据对象,如变量或数组元素的地址。二级指针是指向指针的指针,二级指针并不直接指向数据对象,而是指向一级指针的指针,也就是说,二级指针中存放的是一级指针的地址。下图所示是一级指针和二级指针的示意图。地址值指针变量(a)一级指针值地址地址二级指针一级指针变量(b)二级指针一级指针和二级指针的示意图6.8.2二级指针的定义6.8二级指针二级指针的定义格式为:[存储类型]数据类型**指针名;其中,指针名前面有两个*,表示是一个二级指针。例如,有以下定义:inta,*pa,**pb;pa=&a;pb=&pa;则指针pa存放变量a的地址,即指向了变量a,指针pb存放一级指针pa的地址,即指向了pa。因此,pa是一级指针,pb是二级指针。6.8.3二级指针的使用6.8二级指针一般情况下,二级指针必须与一级指针联合使用才有意义,不能将二级指针直接指向数据对象。【例6.15】用二级指针访问二维数组。如果有如下定义:inta[3][4];int*p[3],**pp;p[0]=a[0];p[1]=a[1];p[2]=a[2];pp=p;6.8二级指针可以编制用二级指针访问二维数组的程序如下:#include<stdio.h>main(){ staticinta[3][4]; staticint*p[3],**pp;

int

i,j; p[0]=a[0];p[1]=a[1];p[2]=a[2];p[3]=a[3]; pp=p;

printf("Pleaseenterthenumberofa[3][4]:\n");

for(i=0;i<3;i++)

for(j=0;j<4;j++)scanf("%d",pp[i]+j);

for(i=0;i<3;i++){for(j=0;j<4;j++)printf("%5d",*(*(pp+i)+j));

printf("\n");}}程序的运行情况为:Pleaseenterthenumberofa[3][4]:123456789101112↙1 2 3 45 6 7 89 1011126.8.3二级指针的使用6.9程序举例1.实例一2.实例二请按水果店里的水果名字(字符的字典顺序)的顺序对水果的名字进行排序,并输出排序后的内容。下图所示为对应的N-S流程图。定义字符型数组name[N][5]存放水果的名称定义指针数组*point[N]for(j=0;j<N;j++)point[j]=name[j]point(point,N)sort(point,N)point(point,N)main函数的N-S流程图定义整型变量ifor(i=0;i<n;i++)输出数组name[i]中的字符串print函数的N-S流程图6.9程序举例1.实例一2.实例二请按水果店里的水果名字(字符的字典顺序)的顺序对水果的名字进行排序,并输出排序后的内容。下图所示为对应的N-S流程图。定义字符型指针变量tempfor(i=0;i<n-1;i++)k=ifor(j=i+1;j<n;j++)strcmp(name[k],name[j])>0?真假k=jk!=i?真假temp=name[i]

name[i]=name[k]

name[k]=tempsort函数的N-S流程图6.9程序举例1.实例一2.实例二#include<stdio.h>#include<string.h>#defineN6/*定义水果种类的数目,假设为6种*/voidsort(char*name[],int);/*排序函数sort的说明*/voidprint(char*name[],int);/*输出函数print的说明*/main(){ staticcharname[N][80]={“orange","banana","apple","peach","grape","tomato"};/*定义二维数组存放水果的名称*/6.9程序举例1.实例一2.实例二char*point[N];/*定义指针数组*/

intj;

for(j=0;j<N;j++)point[j]=name[j];/*指针数组指向二维数组各行的首地址*/

printf("Thenameoffruitbeforesorted:\n");

print(point,N);/*输出排序前的水果名*/

sort(point,N);/*调用函数sort对水果名按字典的顺序进行排序*/

printf("\nThenameoffruitaftersorted:\n");

print(point,N);/*输出排序后的水果名*/}6.9程序举例1.实例一2.实例二voidsort(char*name[],intn){char*temp;

int

i,j,k;

for(i=0;i<n-1;i++){k=i;

for(j=i+1;j<n;j++) if(strcmp(name[k],name[j])>0)k=j;

if(k!=i) {temp=name[i];

name[i]=name[k];

name[k]=temp;}}}6.9程序举例1.实例一2.实例二voidprint(char*name[],intn)/*定义输出函数print*/{inti;

for(i=0;i<n;i++)printf("%s\n",name[i]);}程序运行结果为:Thenameoffruitbeforesorted:orangebananaapplepeachgrapetomatoThenameoffruitaftersorted:Applebananagrapeorangepeachtomato6.9程序举例1.实例一2.实例二用指针数组求两个矩阵a,b的和,将结果存入a,并按矩阵的形式输出。程序代码如下:#include<stdio.h>#defineROW4/*定义矩阵的行数,假设为4*/#defineCOL5/*定义矩阵的列数,假设为5*/main(){/*定义二维数组a并赋初值*/

int[ROW][COL]={{9,22,76,59,10},{80,90,47,35,12},{16,81,50,29,23},{45,57,89,12,15}};6.9程序举例1.实例一2.实例二/*定义二维数组b并赋初值*/

int

b[ROW][COL]={{23,10,17,49,0}, {53,17,75,67,5},{69,87,60,21,7},{13,25,37,49,50}};

int*p[2];/*定义指针数组*/

int

i,j; p[0]=a[0]; p[1]=b[0];

printf("matrix

a[%d][%d]is:\n",ROW,COL);

for(i=0;i<ROW;i++) {for(j=0;j<COL;j++)

printf(“%d",*(p[0]+j+COL*i));

printf("\n"); }6.9程序举例1.实例一2.实例二

printf("matrix

b[%d][%d]is:\n",ROW,COL);

for(i=0;i<ROW;i++) {for(j=0;j<COL;j++)

printf(" %d",*(p[1]+j+COL*i));

printf("\n");}

printf("Thesumofthetwomatrixis:\n");

for(i=0;i<ROW;i++){

for(j=0;j<COL;j++){*(p[0]+j+COL*i)+=*(p[1]+j+COL*i);

printf(" %d",*(p[0]+j+COL*i));}

printf("\n");}}程序的输出结果为:matrixa[4][5]is:922765910809047351216815029234557891215matrixb[4][5]is:2310174905317756756987602171325374950Thesumofthetwomatrixis:323293108101331071221021785168

温馨提示

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

评论

0/150

提交评论