九章指针ppt课件

上传人:仙*** 文档编号:159396922 上传时间:2022-10-09 格式:PPT 页数:111 大小:847.52KB
返回 下载 相关 举报
九章指针ppt课件_第1页
第1页 / 共111页
九章指针ppt课件_第2页
第2页 / 共111页
九章指针ppt课件_第3页
第3页 / 共111页
点击查看更多>>
资源描述
语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 第九章第九章 指指 针针本章要点:本章要点:了解地址与指针的概念了解地址与指针的概念熟练掌握指针变量的定义、初始化及指针的运熟练掌握指针变量的定义、初始化及指针的运算算 掌握指针与数组、指针数组、二级指针等知识掌握指针与数组、指针数组、二级指针等知识 熟练掌握字符串的指针与指向字符串的指针变熟练掌握字符串的指针与指向字符串的指针变量量了解指针与函数的概念了解指针与函数的概念 掌握指针作为函数参数的应用掌握指针作为函数参数的应用了解多维数组指针的概念了解多维数组指针的概念 语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 指针指针是是C C语言中最重要的组成部分。语言中最重要的组成部分。利用利用指针指针可以表示可以表示 复杂的数据结构;动复杂的数据结构;动态分配内存;灵活处理字符串和数组;直态分配内存;灵活处理字符串和数组;直接处理内存地址;接处理内存地址;从函数调用中获取多从函数调用中获取多个值等。个值等。语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章对变量值的存取实质上是通过对变量值的存取实质上是通过地址地址进行的。进行的。示意图示意图9.1 指针的概念指针的概念 C 语言中,任何一个语言中,任何一个变量名变量名实质上都代表着内实质上都代表着内存中的某一个存储单元,每一个存储单元都有一个存中的某一个存储单元,每一个存储单元都有一个地址地址。C系统能自动将系统能自动将变量名变量名和它的和它的地址地址联系起来。联系起来。变量定义及内存分配实例变量定义及内存分配实例对变量的两种访问方式:对变量的两种访问方式:直接访问直接访问 和和 间接访问间接访问 int i,j,k;i=3;j=6;k=9;则编译时系统分别为则编译时系统分别为 i,j,k 各分配各分配 2 个字节个字节。如如:2000,2001 i 2002,2003 j 2004,2005 k 内存用户数据区内存用户数据区36920002000200220043010 变量变量 i变量变量 j变量变量 k变量变量 i_ pointer 如如:int i =3;printf(“%d”,i);执行是执行是:根据变量名根据变量名 i 找到找到 i 的地址的地址(如如:2000),然后,然后 从地址从地址 2000 开始的开始的两个字节中取出数据两个字节中取出数据(即变量的值即变量的值 3),再再将其输出。这种据变量名按变量地址存取将其输出。这种据变量名按变量地址存取变量的值的变量的值的 方式叫方式叫“直接访问直接访问”方式。方式。2000i3 int i=3;表示将表示将 3 送送到变量到变量i 所占的内存单元中所占的内存单元中 C 语言允许定义和使用一种特殊的变量,语言允许定义和使用一种特殊的变量,这种变量专门用于存放其它变量的这种变量专门用于存放其它变量的地址地址。如前。如前面的变量面的变量 i_ pointer。如。如 果把变量果把变量 i 的地址的地址赋给赋给i_ pointer,即即 i_ pointer=&i。这。这 样样就可以通过变量就可以通过变量 i_ pointer 获取变量获取变量 i 的地的地址,址,然后再然后再 取出取出 i 的值。这种方式叫的值。这种方式叫“间接间接访问访问”方式。方式。如图所示如图所示:2000 2000i_pointer3 将将3送到变量送到变量 i_pointer 所所指向指向 的内存单元中的内存单元中i语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 指针指针:一个变量的一个变量的地址地址叫该变量的叫该变量的“指针指针”。指针变量指针变量:用于存放其它变量的用于存放其它变量的地址地址的变量。的变量。指向指向:如如 i_pointeri_pointer=&i=&i ,就称,就称i_pointeri_pointer指向变量指向变量i i 目标变量目标变量:指针变量所指向的变量。指针变量所指向的变量。有关指针的几个概念:有关指针的几个概念:语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 说明说明:1.类型说明符类型说明符表示指针变量所指向的变量的类型,表示指针变量所指向的变量的类型,同类型变量的地址才能放到指向该类型变量的指针同类型变量的地址才能放到指向该类型变量的指针变量中。变量中。例如例如2.不能把一个不能把一个整型量整型量或任何其它或任何其它非地址非地址类型的数据类型的数据赋给一个指针变量。赋给一个指针变量。例如例如示例一示例一 实例二实例二9.2 变量的变量的指针指针和指向变量的和指向变量的指针变量指针变量一、指针变量的定义一、指针变量的定义格式格式:类型说明符类型说明符 *标识符标识符如:如:int *pointer_1 ,*pointer_2;float *fp1,*fp2;&i&jpointer_1pointer_2 i j如如:int i ,j,*pointer_1 ,*pointer_2;若若:pointer_1=&i;pointer_2=&j;则则:flaot f1;int *p ;p=&f1;(不正确不正确)如如:int *p ;p=100;(不合法不合法)但但:p=NULL 或或 p=0 或或 p=0 则是合法则是合法 的,都表示为指针的,都表示为指针赋了赋了“空值空值”。这并不意味着这并不意味着 p 指向指向 地址为地址为0 的单元,而是不指向任何单的单元,而是不指向任何单元,但元,但 p 中有确定的值。中有确定的值。语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章二、指针变量的引用二、指针变量的引用 例例 9.1 main()int a ,b;int *p1 ,*p2;a=100;b=10;p1=&a;p2=&b;printf(“%d,%d n”,a,b);printf(“%d,%d n”,*p1 ,*p2);结果结果:100,10 100,10&a&b10010p1p2 a b*p1*p2“直接访问直接访问”方式方式“间接访问间接访问”方式方式语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 关于关于&与与*运算符的说明运算符的说明:1:&是取地址运算符。是取地址运算符。例如例如 2.&,*,+,同优先级,同优先级,按从按从右至左方右至左方向结合。向结合。示例示例1 示例示例2 示例示例3 如如:int a ,*p1,*p2;p1=&a;则则:&*p1 与与&a 等效等效p2=&*p1;或或 p2=&a;则则:p2 也指向变量也指向变量 a如如:&a ,&b 等。等。*是指针运算符。是指针运算符。用于定义时用于定义时表示其后的表示其后的标识符标识符是是指针变量指针变量。而。而在程序中在程序中*p 则表示指针变量则表示指针变量 p 所所指向的变量,即指向的变量,即目标变量目标变量。如如:int a ,*p1;p1=&a;则则:*&a 与与*p1 等效,即等价于变量等效,即等价于变量 a。&ap1*p1*&a a如如:int a ,*p1;p1=&a;则则:(*p1)+等价于等价于 a+但注意但注意 *p1+不等价于不等价于 (*p1)+因为因为 *p1+等价于等价于*(p1+)即先得即先得 p1 所指向变量的所指向变量的值值,再使指针变量,再使指针变量 p1的值自增的值自增。语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 例例 9.2 main()int *p1,*p2,*p,a,b;scanf(“%d,%d”,&a,&b);p1=&a;p2=&b;if(a b)p=p1;p1=p2;p2=p;printf(“a=%d,b=%d n”,a,b);printf(“max=%d,min=%d n”,*p1,*p2);如输入如输入:5,9 输出输出:a=5,b=9 max=9,min=5 数据指针交换示意图数据指针交换示意图 注意事项注意事项进行地址交换进行地址交换 本程序是采用交换变量本程序是采用交换变量 a 和和 b 的地址来实现两个数的地址来实现两个数的比较的。且比较前后的比较的。且比较前后 a,b 的值并未发生变化的值并未发生变化&a&b59&b&a95p1p2p pp1p2aba b交换前交换前交换后交换后语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章三、三、指针变量作为函数的参数指针变量作为函数的参数 函数调用时,把实际参数的值传递给形式参数。函数调用时,把实际参数的值传递给形式参数。指针变量可以作实际参数,其作用也是将实际参数指针变量可以作实际参数,其作用也是将实际参数的值传递给形式参数,这个时候的值代表是将一个变的值传递给形式参数,这个时候的值代表是将一个变量的量的地址,地址,把把地址地址传送给被调函数的形式参数。传送给被调函数的形式参数。语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 例例 9.3 swap(int *p1,int *p2)int p;p=*p1;*p1=*p2;*p2=p;main()int a ,b,*pointer_1 ,*pointer_2;scanf(“%d,%d”,&a,&b);pointer_1=&a;pointer_2=&b;if(a b)swap(pointer_1,pointer_2);printf(“n%d,%d n”,a,b);交换目标变量,即值的交换交换目标变量,即值的交换语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 若输入若输入:5,9 输出为输出为:9,5&a&b59abpointer_1pointer_2&a&b&a&b59abp1p2pointer_1pointer_2&a&a&b&b95p1pointer_1p2pointer_2ab&a&b95abpointer_1pointer_2(a)(b)(c)(d)本程序采用的是交换本程序采用的是交换 a 和和 b 的的值值,而而 p1和和 p2 的值不变。的值不变。同同例例9.2相反相反.语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 如果把如果把 swap 函数改成函数改成:swap(int *p1,int *p2)int *p;*p=*p1;*p1=*p2;*p2=*p;此句有问此句有问题题语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 swap(int x,int y)int t ;t=x;x=y;y=t;55995995abxya bxy(a)(b)main()int a,b;scanf(“%d,%d”,&a,&b);if(a b)swap(a,b);printf(“n%d,%d n”,a,b);语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章说明说明:1.如想通过函数调用得到如想通过函数调用得到 n 个要改变的值。个要改变的值。(1)在主调函数中设在主调函数中设 n 个变量,并用个变量,并用 n 个指针变量个指针变量 指向它们。指向它们。(2)将指针变量作将指针变量作实参实参,使,使 n 个变量的个变量的地址地址传给所传给所 调用的函数调用的函数形参形参。(3)通过形参指针变量,改变该通过形参指针变量,改变该 n 个变量的个变量的值值。(4)主调函数中就可以使用这些改变了值的变量。主调函数中就可以使用这些改变了值的变量。2.不能通过改变形参指针变量不能通过改变形参指针变量本身的值本身的值而使而使实参指实参指 针变量的值针变量的值改变。改变。&ap1&aq1函数调用时函数调用时&bq1在被调函数中在被调函数中语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 3.可以通过改变形参指针变量所可以通过改变形参指针变量所指向指向的变量的值来改的变量的值来改 变实参指针变量所变实参指针变量所指向指向的变量的值。的变量的值。5 a&a p1&aq1 补例补例1:void point(int *q1)q1+=2;main()int *p1,a=4;p1=&a;point(p1);printf(“%d n”,*p1);语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 4 a&a p1&aq1 补例补例2:void point(int *q1)*q1+=2;main()int *p1,a=4;p1=&a;point(p1);printf(“%d n”,*p1);语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 swap(int *p1,int *p2)int *p;p=p1;p1=p2;p2=p;main()int a,b,*pointer_1 ,*pointer_2;scanf(“%d,%d”,&a,&b);pointer_1=&a;pointer_2=&b;if(a b)swap(pointer_1,pointer_2);printf(“n%d,%d n”,a,b);本函数中试图通过改变本函数中试图通过改变形参指针变形参指针变量量的值来使的值来使实参指针变量实参指针变量的值改变的值改变语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章a&a&b59bpointer_1pointer_2(a)&a&b59abp1p2(b)&b&a59abp1p2(c)a&b&a59bpointer_1pointer_2(d)&a&b59abpointer_1pointer_2(d)语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 exchange(int *q1,int *q2,int *q3)if(*q1 *q2)swap(q1,q2);if(*q1 *q3)swap(q1,q3);if(*q2 *q3)swap(q2,q3);例例 9.4 swap(int *pt1,int *pt2)int p;p=*pt1;*pt1=*pt2;*pt2=p;语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章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);运行如下运行如下:9,0,10:9,0,10 10,9,0 10,9,0语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章9010p1 a b cp2 p3 9010q1 b cq2 q3 a exchange90pt1 bpt2 a swapp1q1 p1语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 9.3 9.3 数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量 C C 语言中,指针变量可以指向变量,也可以指向语言中,指针变量可以指向变量,也可以指向数组数组和和数组元素数组元素。数组的指针数组的指针:数组的数组的起始地址起始地址(首地址首地址 )数组元素的指针数组元素的指针:数组元素的地址数组元素的地址语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 一、指向一维数组的指针变量的定义与赋值一、指向一维数组的指针变量的定义与赋值 指向数组的指针变量的定义同指向变量的指针变量的指向数组的指针变量的定义同指向变量的指针变量的 定义相同。定义相同。如如:int a10;int *p ;若若:p=&a0;则则 p 指向了指向了a 数组的第数组的第 0 号元素。号元素。由于数组名代表数组的由于数组名代表数组的首地址首地址(即即起始地址起始地址),故故:p=&a0;等价于等价于 p=a;也可也可:int a10;int *p=&a0;int *p=a;注意注意 int *p=&a0;的含义是将数组的的含义是将数组的首地址首地址赋给赋给指针变量指针变量 p,而不是赋给,而不是赋给(*p)。语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章二、二、通过指针引用数组元素通过指针引用数组元素 如如:int a10 ,*p ;p=a;则则:(1)p a0的地址的地址 p+1 a1的地址的地址 p+i ai的地址的地址 (2)*p=a0,*(p+1)=a1,*(p+i)=ai说明说明:1.数组元素在内存中是连续存放的,数组元素在内存中是连续存放的,C 语言规定,语言规定,指针变量指针变量 p+1 指向下一个元素指向下一个元素(不不是简单的加是简单的加 1)如数组元素为实型,如数组元素为实型,则则 p+1 所表示的实所表示的实际地址是际地址是 p+1 d=p+1 4 (d 为一个数组元素所占为一个数组元素所占的字节数的字节数)&a0 1 320 a0a1a9p语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 2.(p+i)表示指向表示指向 ai 的地址,而的地址,而 a+i 也表示也表示 ai 的的地址,故地址,故 程序中程序中(p+i)等价于等价于 a+i。如如:p+2;a+2;3.指向数组的指针变量可以带下标。指向数组的指针变量可以带下标。如如:pi *(p+i)综上所述综上所述:数组元素的引用可以数组元素的引用可以:(1)下标法下标法:数组名数组名下标下标 或或 指针变量名指针变量名下标下标 (2)指针法指针法:*(p+i)或或 *(a+i)(假定假定:int a10 ,*p=a;)a数组数组 p p+1,a+1 p+i,a+i p+9,a+9 a0 a1 ai a9*(p+i)语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 例例 9.5 用三种方法输出数组各元素。用三种方法输出数组各元素。(1)下标法下标法 main()int a10,i;for(i=0;i 10;i+)scanf(“%d”,&ai);printf(“n”);for(i=0;i 10;i+)printf(“%d”,ai);语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 (2)用数组名计算元素地址用数组名计算元素地址 main()int a10,i;for(i=0;i 10;i+)scanf(“%d”,&ai);printf(“n”);for(i=0;i 10;i+)printf(“%d”,*(a+i);语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章(3)用指针变量指向数组元素用指针变量指向数组元素 main()int a10,i,*p;for(i=0;i 10;i+)scanf(“%d”,&ai);printf(“n”);for(p=a;p (a+10);p+)printf(“%d”,*p);语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章注意几点注意几点:(1)(1)指针变量可以作自增,自减运算。指针变量可以作自增,自减运算。如如:+p p ,p p 而数组名不能作自增,自减运算。而数组名不能作自增,自减运算。如如:a a+,+,a a 等均不合法。因为等均不合法。因为数组名是常量数组名是常量。(2)(2)注意指针变量的当前值。注意指针变量的当前值。如如:例例 9.69.6 语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 main()int a10,i,*p;p=a;for(i=0;i 10;i+)scanf(“%d”,p+);printf(“n”);for(i=0;i 10;i+,p+)printf(“%d”,*p);for(i=0,p=a;i 10;i+,p+)或或 for(p=a;p a+10;p+)pa 数组数组语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 (3)注意指针变量的运算注意指针变量的运算 如如:int a10,i,*p;p=a;则则:a.p+(或或 p+=1)表示表示 p 指向指向 a1,此时若执行此时若执行*p 则取出则取出 a1 元素的值。元素的值。b.“*”与与“+”同优先级,自右往左结合。同优先级,自右往左结合。如如:*p+等效于等效于*(p+),即先取即先取 p 所指向变量的值,所指向变量的值,再使再使 p+1。而。而*(p+)与与*(+p)的作用不同。前的作用不同。前 者先取者先取*p 的值,后使的值,后使p+1;后者是先使后者是先使 p+1,再,再 取取*p 的值的值。c.(*p)+表示使目标变量的值加表示使目标变量的值加 1。而不是指针变而不是指针变 量的值加量的值加 1d.*(p+)等价于等价于 ai+*(+p)等价于等价于 a+i 即先使即先使 p 自增自增,再作再作*运算。运算。语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 如如:main()int a100,*p;p=a;while(p a+100)printf(“%d”,*p+);main()int a100,*p;p=a;while(p a+100)printf(“%d”,*p);p+;语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章三、数组名作函数参数 数组名作函数参数时,实际上是将实参数组的首地址 传给形参。这样实参数组与形参数组共占同一段内存。使得在调用函数过程中,形参数组中元素值发生变化也 就使实参数组的元素值随之而发生变化。语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 main()f(int arr ,int n)int array10;f(array,10);arrayarr语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 void inv(int x ,int n)int t,i,j,m=(n 1)/2;for(i=0;i =m;i+)j=n 1 i;t=xi;xi=xj;xj=t;return ;可去掉可去掉 3 7 9 11 0 6 7 5 4 2 2 4 5 7 6 0 11 9 7 3imj 例例 9.7 将数组将数组 a 中中 n 个整数按相个整数按相反顺序反顺序存放。存放。即将即将第一第一个元素和个元素和最后最后一个元素对换,将第二个同倒一个元素对换,将第二个同倒 数第二个对换数第二个对换.即两两对换,直到即两两对换,直到:a(n 1)/2 与与 a n (n 1)/2 1 对换为止。对换为止。语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 void main()static int i,a10=3,7,9,11,0,6,7,5,4,2 ;printf(“The original array :n”);for(i=0;i 10;i+)printf(“%d,”,ai);printf(“n”);inv(a,10);printf(“The array has been inverted:n”);for(i=0;i 10;i+)printf(“%d,”,ai);printf(“n”);运行结果运行结果:The original array :3,7,9,11,0,6,7,5,4,2 The array has been inverted:2,4,5,7,6,0,11,9,7,3 语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 以上程序也可以改为如下以上程序也可以改为如下:void inv(int *x,int n)int *p,t,*i,*j,m=(n 1)/2;i=x;j=x+n 1;p=x+m;for(;i =p;i+,j )t=*i;*i=*j;*j=t;return ;a 数组数组 a0 a1.a93 7 0 i,x p=x+m j 2 4 5 7 6 11 9语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章main()static int i,a10=3,7,9,11,0,6,7,5,4,2 ;printf(“The original array :n”);for(i=0;i 10;i+)printf(“%d”,ai);printf(“n”);inv(a,10);printf(“The array has been inverted:n”);for(i=0;i 10;i+)printf(“%d”,ai);printf(“n”);语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 int max ,min;void max_min_value(int array ,int n)int *p ,*array_end;array_end=array+n;max=min=*array;for(p=array+1;p max)max=*p;else if(*p min)min=*p ;return;等价于等价于*(array+0)即即 array0例例 9.8 从从 10 个数中找出其中最大值和最小值个数中找出其中最大值和最小值语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章void main()int i,number10;printf(“enter 10 data n”);for(i=0;i 10;i+)scanf(“%d”,&numberi);max_min_value(number,10);printf(“n max=%d,min=%d n”,max,min);运行结果运行结果:enter 10 data 2 4 6 8 0 3 45 67 89 100 max=100,min=3语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章此例也可改用指针变量来传送地址,程序可改为此例也可改用指针变量来传送地址,程序可改为:int max ,min;void max_min_value(int *array ,int n)int *p ,*array_end;array_end=array+n;max=min=*array;for(p=array+1;p max)max=*p;else if(*p min)min=*p ;return;语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章void main()int i,number10 ,*p;p=number;printf(“enter 10 data n”);for(i=0;i 10;i+,p+)scanf(“%d”,p);printf(“the 10 data:n”);for(p=number,i=0;i 10;i+,p+)printf(“%d”,*p);p=number;max_min_value(p,10);printf(“n max=%d,min=%d n”,max,min);for(p=number;p (number+10);p+)综上所述,对于实参数组想在被调函数中改变综上所述,对于实参数组想在被调函数中改变此数组元素的值,实参与形参的对应关系可以如下此数组元素的值,实参与形参的对应关系可以如下:语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 (1)二者都用数组名二者都用数组名 main()f(int x ,int n)int a10;f(a,10);特点特点:a 和和 x 数组共用同一段内存单元。数组共用同一段内存单元。(2)实参为数组名,形参用指针变量实参为数组名,形参用指针变量 main()f(int *x ,int n)int a10;f(a,10);语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 (2)实参为数组名,形参用指针变量实参为数组名,形参用指针变量 main()f(int *x ,int n)int a10;f(a,10);特点特点:实参将数组的首地址传给形参指针变量,通过指实参将数组的首地址传给形参指针变量,通过指 针变量指向数组中的任一元素针变量指向数组中的任一元素,进而作相应的处理。进而作相应的处理。语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 (3)二者都用指针变量二者都用指针变量 main()f(int *x ,int n)int a10 ,*p;p=a;f(p,10);特点特点:先使先使 p 指向指向 a 数组,再将数组,再将 p 传给传给 x,使使 x 也指向也指向 a 数组,从而进行处理。数组,从而进行处理。语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章(4)实参为指针变量,而形参为数组名实参为指针变量,而形参为数组名 main()f(int x ,int n)int a10 ,*p;p=a;f(p,10);特点特点:利用指针变量将利用指针变量将 a 数组的首地址传给数组的首地址传给 x 数组。使数组。使 两数组共用同一段内存单元。利用两数组共用同一段内存单元。利用xi值的变化,值的变化,使使ai的值也发生变化。的值也发生变化。注意注意:在上述四种处理方式中,当用指针变量作实参时,在上述四种处理方式中,当用指针变量作实参时,必须先使指针变量有确定的值,即指向一个已定必须先使指针变量有确定的值,即指向一个已定 义的数组义的数组。语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 四四、二维数组的指针和指向二维数组的指针变量二维数组的指针和指向二维数组的指针变量 1.二维数组和数组元素的地址二维数组和数组元素的地址 C 语言中二维数组实际上是由若干个按行存放的一语言中二维数组实际上是由若干个按行存放的一维数组构成的。如:维数组构成的。如:int a34;a0 a00 a01 a02 a03 a1 a10 a11 a12 a13 a2 a20 a21 a22 a23 a 代表首元素的地址,而此时首元素代表首元素的地址,而此时首元素a0又是一个包含又是一个包含有有 4个元素的一维数组。所以个元素的一维数组。所以 a(或或 a+0)表示二维数组表示二维数组第第0 行的地址。同理:行的地址。同理:a+1,a+2 分别表示二维数组分别表示二维数组第第 1 行和第行和第 2 行的地址。所以,二维数组名是一个行的地址。所以,二维数组名是一个行指行指针针。a0,a1,a2分别表示一维数组名,所以分别表示一维数组名,所以a0代代表表 一维数组一维数组a0中第中第0列元素的地址,即列元素的地址,即&a00。a语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章同理:同理:a1的值为的值为&a10,a2的值为的值为&a20。二维数组元素的地址可表示为:二维数组元素的地址可表示为:(1)&aij (2)ai+j (3)*(a+i)+j (因为因为 ai 等价于等价于*(a+i)二维数组元素的引用可表示为:二维数组元素的引用可表示为:(1)aij (2)*(ai+j)(3)*(*(a+i)+j)2.指向二维数组的指针变量指向二维数组的指针变量 (1)指向二维数组的指向二维数组的列指针列指针变量变量 int a34,*p;语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 如:如:p=a0;或或 p=&a00;p=*(a+0);p=*a;则则 p 是一个指向二维数组是一个指向二维数组 a 第第 0 行第行第 0 列元素的指针列元素的指针 变变量。量。(即即 p 是一个是一个列指针变量列指针变量)此时此时 p+1 则指向第则指向第 0 行行 第第 1 列的元素。列的元素。说明:说明:上述上述 p=a0;不能写成不能写成 p=a;因为尽管因为尽管 a0 和和 a 都表示地址且都表示地址且 值相同,但二者的值相同,但二者的地址基类型地址基类型不同。不同。即即 a0 是一个是一个列地址列地址,而,而 a 是一个是一个 行地址行地址。1 3 5 7 2 4 6 81112 13 14p p+1语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章#include “stdio.h”void main()int a34=1,2,3,4,9,8,7,6,10,11,5,2;int *p=a0;(或或 int *p=&a00;)for(;p a0+12 ;p+)if(p a0)%4=0)printf(“n”);printf(“%4d”,*p);(2)指向二维数组的指向二维数组的行指针行指针变量变量 由于二维数组是由按行存放的一维数组构成,由于二维数组是由按行存放的一维数组构成,C 语语 言中可以用言中可以用行指针变量行指针变量来引用二维数组元素。来引用二维数组元素。语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 定义格式:定义格式:数据类型数据类型 (*标示符标示符)常量常量 如:如:int (*p)4;表示表示 p 所指的对象是有所指的对象是有 4 个整型元素的数组。个整型元素的数组。int a34 ,(*p)4;若:若:p=a;则则 p 是指向是指向 a 数组第数组第 0 行行的指针变量,的指针变量,即即 p 是一个是一个行指针变量行指针变量。此时,此时,p+1则指向则指向 a 数组第数组第 1 行,行,p+i 则指向则指向 a 数组第数组第 i 行。行。所以,所以,*(p+i)+j 表示表示 a 数组数组 中第中第 i 行行 j 列元素的地址。列元素的地址。而而 *(*(p+i)+j)则表示表示则表示表示 a 数组中第数组中第 i 行行 j 列元素的列元素的值值。注意注意不能写成不能写成 p=a0。1 3 5 7 2 4 6 811 12 13 14pp+1语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 例:例:输出二维数组任意行任意例元素的值。输出二维数组任意行任意例元素的值。void main()int a34=1,2,3,4,9,8,7,6,10,11,5,2;int (*p)4 ,i,j;p=a;scnaf(“i=%d,j=%d”,&i,&j);printf(“a%d,%d =%dn”,i,j,*(*(p+i)+j);3.二维数组名和指向二维数组的指针变量作函数参数二维数组名和指向二维数组的指针变量作函数参数 补充例:补充例:用用函数调用方式函数调用方式编写程序找出二维数组编写程序找出二维数组a 中每中每 行的最小值并输出。要求:行的最小值并输出。要求:(1)二维数组元素的值用随机函数产生二维数组元素的值用随机函数产生(0 50)之间之间 (2)每行中元素的最小值在每行中元素的最小值在line_min()函数中求出。函数中求出。(3)在主函数中输出每行的最小值。在主函数中输出每行的最小值。语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 void main()1、定义一个二维数组定义一个二维数组 2、调调随机函数随机函数对二维数组对二维数组 元素元素赋值赋值 3、调用调用 line_min 函数函数 4、输出结果到屏幕输出结果到屏幕 line_min()1、接收实参接收实参 2、求二维数组每行中的最小值求二维数组每行中的最小值 语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 方法一、方法一、用用列指针列指针来求解来求解#include “stdlib.h”#define N 3#define M 4 void main()int aNM,min,i,j;for(i=0;i N;i+)for(j=0;j M;j+)aij=random(50);printf(“%4d”,aij);if(j+1)%4=0)printf(“n”);for(i=0;i N;i+)min=line_min(ai);printf(“a%d:min=%d n”,i,min);语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 line_min(int *p)int j,min ;min=*(p+0);for(j=1;j *(p+j)min=*(p+j);return min;方法二、方法二、用用行指针行指针来求解来求解 语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章#include “stdlib.h”#define N 3#define M 4 void main()int aNM,min,i,j;for(i=0;i N;i+)for(j=0;j M;j+)aij=random(50);printf(“%4d”,aij);if(j+1)%4=0)printf(“n”);for(i=0;i N;i+)min=line_min(a+i);printf(“a%d:min=%d n”,i,min);语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 line_min(int (*p)M)int j,min ;min=*(*p);for(j=1;j *(*p+j)min=*(*p+j);return min;说明:说明:random(x)函数能产生一个函数能产生一个(0 x 1)间的随间的随机整数。机整数。相关的函数有:相关的函数有:rand(),其功能是产生,其功能是产生 0 32767间的随机数。间的随机数。如:如:(rand()%90+10.0)/10.0 就能产生就能产生 1.0 10.0 之间的实数。之间的实数。语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章9.4 字符串的指针和指向字符串的指针变量字符串的指针和指向字符串的指针变量 字符串的指针字符串的指针就是字符串的就是字符串的首地址首地址。一、一、字符串的表示形式字符串的表示形式 1:用字符数组实现用字符数组实现 例例 9.16 main()static char string =“I Love China”;printf(“%sn”,string);例中例中 string 是数组名,是数组名,它表示字符数组的它表示字符数组的首地址首地址。相应的相应的 stringi 表示数组中的一个元素。如表示数组中的一个元素。如:string4 代表第代表第 5 个元素,即个元素,即 字母字母 v 2:用字符指针实现用字符指针实现语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 char *string;string=“I Love China”;或者或者:char *string=“I Love China”;其含义是将字符串的其含义是将字符串的首地址首地址赋给指针变量赋给指针变量 string。尽管没有直接定义字符型数组,但实际上尽管没有直接定义字符型数组,但实际上 C 语言对字语言对字符符串常量均按字符数组来处理。即在内存中开辟了一个字符串常量均按字符数组来处理。即在内存中开辟了一个字符数组用来存放字符串常量。数组用来存放字符串常量。例例 9.17 main()char *string=“I Love China”;printf(“%sn”,string);语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 注意注意:C 语言中对字符串可以进行整体输入和输出。语言中对字符串可以进行整体输入和输出。而对数值型数组则不能用数组名来输出它的全部而对数值型数组则不能用数组名来输出它的全部 元素,只能逐个元素输出。元素,只能逐个元素输出。对字符串的处理可以用对字符串的处理可以用下标法下标法,也可用,也可用指针法指针法。例例 9.18 将字符串将字符串 a 复制到字符串复制到字符串 b。main()char a =“I am a boy.”,b20;for(i=0;*(a+i)!=0;i+)*(b+i)=*(a+i);*(b+i)=0;printf(“string a is :%s n”,a);语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 printf(“string b is :”);for(i=0;bi!=0;i+)printf(“%c”,bi);printf(“n”);运行结果运行结果:string a is :I am a boy.string b is :I am a boy.例例 9.19 用指针变量来处理例用指针变量来处理例 9.18 问题问题.main()char a =“I am a boy.”,b20,*p1,*p2;int i;p1=a;p2=b;for(;*p1!=0;p1+,p2+)语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 *p2=*p1;*p2=0;printf(“string a is :%sn”,a);printf(“string b is :”);for(i=0;bi!=0;i+)printf(“%c”,bi);printf(“n”);Iamaboy.0ap1p1bp2p2二、二、字符串指针作函数参数字符串指针作函数参数 用用字符数组名字符数组名和指向字符串的和指向字符串的指针指针变量变量作函数参数,均可以处理字符串。作函数参数,均可以处理字符串。例例 9.20 用函数调用实现字符串的复制。用函数调用实现字符串的复制。I0语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 (1)用字符数组作函数参数用字符数组作函数参数 void copy_string(char from ,char to )int i=0;while(from i!=0)(先判断,后赋值先判断,后赋值)toi=from i ;i+;toi=0;main()char a =“I am a teacher.”;char b =“you are a student.”;printf(“string_a=%sn string_b=%sn”,a,b);copy_string(a,b);printf(“n string_a=%sn string_b=%sn”,a,b);语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 运行结果运行结果:string_a=I am a teacher.string_b=you are a student.string_a=I am a teacher.string_b=I am a teacher.本程序本程序 main 函数中也可用字符型指针变量函数中也可用字符型指针变量。改写如下改写如下:main()char *a=“I am a teacher.”;char *b=“you are a student.”;printf(“string_a=%sn string_b=%sn”,a,b);copy_string(a,b);printf(“n string_a=%sn string_b=%sn”,a,b);语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 (2)形参用字符指针变量形参用字符指针变量 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=%sn string_b=%sn”,a,b);copy_string(a,b);printf(“n string_a=%sn string_b=%sn”,a,b);语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 (3)对对 copy_string 函数的简化函数的简化 a.void copy_string(char *from ,char *to)while(*to=*from)!=0)from+;to+;即先赋值,后判断即先赋值,后判断。故故 *to=0 语句不要语句不要。b.void copy_string(char *from ,char *to)while(*to+=*from+)!=0);注意分号语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 c.void copy_string(char *from ,char *to)while(*from!=0)*to+=*from+;*to=0;d.void copy_string(char *from ,char *to)while(*from)*to+=*from+;*to=0;*from!=0*from!=0while(*from!=0)语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 e.void copy_string(char *from ,char *to)wh
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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