C语言程序设计第指针程序设计_第1页
C语言程序设计第指针程序设计_第2页
C语言程序设计第指针程序设计_第3页
C语言程序设计第指针程序设计_第4页
C语言程序设计第指针程序设计_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

1、C语言程序设计第指针程序设计第7章 指针程序设计7.1 指针概述 7.2 指针变量的定义和使用7.3 指针与数组 7.4 指针作为函数的参数7.5 指针函数7.6 指针应用举例7.1 指针概述指针与指针变量变量的直接访问和间接访问7.1 指针概述指针与指针变量某个变量所占用的内存空间的开始地址称为该变量的地址,C语言将这一地址称为指针,存储这一地址的变量称为指针变量。通过指针变量可以实现对其他变量的访问。指针变量可以指向任何一种数据类型,如可以指向基本类型的变量,也可以指向数组等。7.1 指针概述变量直接访问是指通过变量名直接使用变量数据。例如:int a=10,b=20,c;c=a+b;pr

2、intf(%dn,c);变量间接访问是指通过指针变量去访问其他变量数据。7.2 指针变量的定义和使用7.2.1 指针变量程序示例 7.2.2 定义指针变量7.2.3 使用指针变量 7.2.1 指针变量程序示例例7-1 使用指针变量输出数据程序。 #includeint main(void)int a=2008; int *p; p=&a; printf(%dn, *p); return 0; 定义指针变量 p指向a 用*p表示变量a的值 7.2.2 定义指针变量一般格式 数据类型 *指针变量名1,*指针变量名2,;例如:int *p1,*p2; float *q;指针变量允许和其他变量同时定义

3、: char m,n,*p,*q;注意“数据类型”是指针变量要指向的变量的数据类型。7.2.3 使用指针变量1指针变量的初始化一般格式 数据类型 *指针变量名1=地址1,*指针变量名2=地址2,; 例如:int m; int *p=&m;2指针变量的赋值一般格式 指针变量=变量地址; 例如:int m=196,*p,*q; p=&m; q=p; pm&m p196&mq7.2.3 使用指针变量3使用指针变量输入数据当指针变量有了确切的指向目标后,即可使用该指针变量为指向的目标输入数据。 int score,*p; p=&score; scanf(%d,p);scanf语句的功能与下列语句等价:

4、 scanf(%d,&score); 7.2.3 使用指针变量4指向运算“*”与目标访问对于指针变量p,访问其指向的变量时,使用“*”运算符: *p例如,对上面的程序段,输出变量score的数据: printf(%d,*p);其中,*p表示p指向的目标score 。例7-2定义指针变量p1、p2,并任意输入两个整数a、b,使得p1指向其中的较大值,p2指向其中的较小值 。#includeint main()int *p1,*p2,*p,a,b;printf(Input: );scanf(%d,%d,&a,&b);p1=&a;p2=&b;if(ab)p=p1;p1=p2;p2=p; printf

5、(Output: );printf(%d,%dn,*p1,*p2); return 0;使用指针变量7.3 指针与数组7.3.1 指针与一维数组 7.3.2 指针与二维数组 7.3.3 指针与字符串 7.3.4 指针数组 指针与一维数组 主要内容如何把一个指针和一维数组关联起来,即怎样使指针指向一维数组如何使用指针访问一维数组的元素要解决的问题用指针实现一维数组的数据处理 C语言程序设计-理论方法与实践(第2版)用指针访问一维数组 1指针与一维数组的关系 对于长度是N的一维数组a,当使用指针p指向其首元素后,即可通过指针p访问数组的各个元素。简单类型数组aa0用*p表示a1用*(p+1)表示a

6、i用*(p+i)表示 指向一位数组的指针变量C语言程序设计-理论方法与实践(第2版)用指针访问一维数组 2定义和使用指向一维数组的指针变量 若有定义:int aN,*p; /* N为符号常量 */ 则以下任何语句都能使指针变量p指向一维数组ap=a; p=&a0;当指针变量p指向a数组之后,就可以使用p访问a数组的元素。例如,可以使用下面的语句输出元素a0和a1的值。printf(“%d,%d”,*p,*(p+1);用指针访问一维数组 例7-3 用指针实现一维数组的输入输出。 程序一#include#define N 10int main() int aN; int *p=a,i; for(i

7、=0;iN;i+) scanf(%d,p+i); for(i=0;iN;i+) printf(%d ,*(p+i); return 0; &aiaiC语言程序设计-理论方法与实践(第2版)用指针访问一维数组 例7-3 用指针实现一维数组的输入输出。 程序二#include#define N 10int main() int aN; int *p=a,i; for(i=0;iN;i+) scanf(%d,p+); p=a; for(i=0;iN;i+) printf(%d ,*p+); return 0;&aiaiC语言程序设计-理论方法与实践(第2版)用指针访问一维数组 例7-3 用指针实现一

8、维数组的输入输出。 程序三#include#define N 10int main(void) int aN,*p; for(p=a;p(a+N);p+) scanf(%d,p); for(p=a;p(a+N);p+) printf(%d ,*p); return 0;&aiai用指针访问一维数组 例7-4 用指针法访问数组,求得一维数组元素的最大值。#include#define N 10int main(void)int aN,i,max,*p;p=a; printf(Data: );for(i=0;iN;i+) scanf(%d,p+i);max=*p; for(i=1;iN;i+) i

9、f(max*(p+i)max=*(p+i);printf(Max: %dn,max);return 0;7.3.2 指针与二维数组主要内容如何把一个指针和二维数组关联起来,即怎样使指针指向二维数组如何使用指针访问二维数组的元素要解决的问题用指针实现二维数组的数据处理 7.3.2 指针与二维数组102030408070605018273645回顾二维数组的存储 10a0020a0130a0240a0380a1070a1160a1250a1318a2027a2136a2245a23int a34; pp+1p+2p+3p+4p+5p+6p+7p+8p+9p+10p+11如何使p指向首元素?aij的

10、指针如何表示? 问题7.3.2 指针与二维数组指针和二维数组元素的对应关系设p是指针变量,若有:p=a0;则p+j将指向a0数组中的元素a0j。由于a0、a1、aM-1等各个行数组依次连续存储,则对于a数组中的任一元素aij,指针的一般形式如下:p+i*N+j元素aij相应的指针表示为:*( p+i*N+j)aij也可用指针下标法表示:pi*N+j7.3.2 指针与二维数组举例int a34=10,20,30,40,50,60,70,80,90,91,92,93;int *p=a0;则数组a的元素a12对应的指针为:p+1*4+2元素a12也就可以表示为:*( p+1*4+2)用下标表示法,a

11、12表示为:p1*4+27.3.2 指针与二维数组例7-5 用指针访问二维数组的方法,求二维数组元素的最大值。#includeint main(void)int a34=3,17,8,11,66,7,8,19,12,88,7,16;int *p,max;for(p=a0,max=*p;pmax)max=*p;printf(Max=%dn,max); return 0;7.3.3 指针与字符串使字符型指针变量指向字符串的方法 定义指针变量时初始化指向字符串。char *p=a string; 使指针变量指向字符型数组,从而使其指向字符串。char name20, *str;gets(name);

12、str=name;7.3.3 指针与字符串例7-6从键盘输入一个字符串,统计其中的数字字符个数。#include#define N 100int main(void) char strN,*p; int count; p=str; gets(p); for(count=0;*p!=0;p+) if(*p=0&*p=9) count+; printf(Total: %dn,count); return 0; 7.3.4 指针数组数组元素为指针类型的数组称为指针数组,指针数组中的每一个元素都是指针变量。 一维指针数组的定义形式如下: 数据类型 *数组名数组长度;例: char *days7;该语句

13、定义了一个名为days的字符型指针数组,其每一个元素都是指向char变量的指针变量。指针数组的每个元素是指针变量,只能存放地址,所以对指向字符串的指针数组赋初值时,要把存放字符串的首地址赋给指针数组的对应元素。例:char *days7=Sunday,Monday,Tuesday, Wednesday,Thursday,Friday,Saturday;C语言程序设计-理论方法与实践(第2版)7.3.4 指针数组指针数组元素days0days1days2days3days4days5days6字符串SundayMondayTuesdayWednesdayThursdayFridaySaturda

14、ychar *days7=Sunday,Monday,Tuesday, Wednesday,Thursday,Friday,Saturday;7.3.4 指针数组char *days7=Sunday,Monday,Tuesday, Wednesday,Thursday,Friday,Saturday;例7-7 分行输出days数组指向的字符串。#includeint main() int i;char *days7=Sunday,Monday,Tuesday, Wednesday, Thursday,Friday,Saturday;for(i=0;i7;i+)puts(daysi); retu

15、rn 0;7.4 指针作函数的参数7.4.1 简单变量指针作函数参数7.4.2 指向数组的指针作函数的参数7.4.3 字符串指针作函数的参数7.4.4 指针数组作函数的参数实参:简单变量地址void swap(int *p1,int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp;7.4.1 简单变量指针作函数参数形参:指针变量#includeint main() void swap(int *,int *); int x,y; scanf(%d,%d,&x,&y); if(xy)swap(&x,&y); printf(%d,%dn,x,y); retur

16、n 0; 例7-8 任意输入两个整数,然后按照先大后小的顺序将其输出。简单变量指针作函数参数,实现简单变量的地址在函数中的传递。 7.4.1 简单指针变量作函数参数例7-9 用比较交换法,将一维数组的最大值移到数组的最末元素位置,交换过程用上述swap()函数实现。#includeint main()void swap(int *,int *); int i,a10=33,-12,97,3,7,18,9,51,10,9;for(i=0;iai+1)swap(&ai,&ai+1); for(i=0;i10;i+)printf(%5d,ai);printf(n); return 0;void sw

17、ap(int *p1,int *p2)int temp;temp=*p1;*p1=*p2;*p2=temp; 7.4.2 指向数组的指针作函数的参数 例7-10 设计求一维数组元素最大值的函数pv_max(),并在主函数中调用它求数组元素最大值 。问题分析与算法设计 为了方便函数编写,先假定数组长度为n,指针p指向该数组。 设计pv_max()函数 原型:int pv_max(int *p,int n) 功能:在长度为n、由p指向的一维数组中求元素最大值。 用main()函数作为主控函数。7.4.2 指向数组的指针作函数的参数 int pv_max(int *p,int n) int i,ma

18、x=*p; for(i=1;imax) max=*(p+i); return max; #include#define N 10int main(void) int pv_max(int *,int); int aN,i; for(i=0;iN;i+) scanf(%d,&ai); printf(Max=%dn,pv_max(a,N); return 0; 字符串指针作函数参数字符串指针作函数的参数,与前面介绍的数组指针作函数参数没有本质的区别,函数间传递的都是地址值,所不同的仅是指针指向对象的类型不同而已。例7-11 改写例7-6的程序,将统计数字字符的过程改由用户函数实现,要求字符串指针作

19、函数参数。7.4.3 字符串指针作函数参数#include#define N 100int main(void)char stringN; int count_p(char *); gets(string); printf(Total: %dn,count_p(string); return 0;int count_p(char *p) int count; for(count=0;*p!=0;p+)if(*p=0&*p=9) count+;return count; 形参:字符串指针实参:字符数组名7.4.4 指针数组作函数的参数指针数组的元素是指针变量,用指针数组能够实现一组字符串的处理。

20、当用指针数组作函数参数时,就可设计通用的多字符串操作函数。7.4.4 指针数组作函数的参数#include#includeint main() void string_sort(char *,int); void string_out(char *,int); char *days7=Sunday,Monday,Tuesday, Wednesday, Thursday, Friday,Saturday; string_sort(days,7); string_out(days,7); return 0; void string_out(char * string ,int n) int i;

21、for(i=0;in;i+) printf(%s , string i); void string_sort(char *string,int n) char *temp; int i,j; for(i=1;in;i+) for(j=0;j0) temp= string j; string j= string j+1; string j+1=temp; 例7-13 编写能对多个字符串排序的函数,并调用该函数将一组字符串按字典顺序排序。C语言程序设计-理论方法与实践(第2版)7.5 指针函数函数返回值是指针类型的函数称为指针函数 指针函数的定义的一般格式数据类型 *函数名(形参表) 函数体 函数

22、体中的return命令须返回一个地址值C语言程序设计-理论方法与实践(第2版)7.5 指针函数例7-14 编写能够查找长度最大的字符串的函数,并调用该函数求一组字符串中的最长字符串。问题分析与算法设计 设计查找最长字符串的函数max_len(),其原型如下:char *max_len (char *string,int n)其中,string为指向字符串的指针数组,n为字符串个数。函数功能:在string指向的n个字符串中查找最长字符串,返回该字符串的地址。 设计主函数,其功能包括:通过指针数组提供一组字符串;调用函数max_len()求得最长字符串,并输出结果。C语言程序设计-理论方法与实践

23、(第2版)7.5 指针函数#include#includeint main() char *max_len(char *,int); char *p_string4=Sydney2000,Beijing2008,Athens1996,Korea1992; puts(max_len(p_string,4); return 0;char *max_len(char *string,int n) int i,posion,max_l; posion=0; max_l=strlen(string0); for(i=1;imax_l) max_l=strlen(stringi); posion=i; r

24、eturn(stringposion); 字符串指针数组字符串个数存储字符串地址的数组名返回最长字符串的首地址C语言程序设计-理论方法与实践(第2版)7.6 指针应用举例 “学生成绩分等统计”进一步函数化 三色球问题 C语言程序设计-理论方法与实践(第2版)7.6 指针应用举例 例7-15将例6-16的“学生成绩分等统计”程序进一步函数化,把输出统计结果的过程改由函数实现 。问题分析与算法设计 定义一维数组的输出函数output()函数原型: void outpu(int *p,int n)其中,p为指向一维数组的指针,n为元素个数。函数功能:将指针变量p指向的一维数组的全部n个元素输出。 在

25、例6-16的程序中,使用一维数组r存储各等级的统计结果,本程序仍然使用数组r存储统计结果。输出r数组各个元素的过程,通过调用output()函数实现,调用形式为output(r,5)。 实现程序C语言程序设计-理论方法与实践(第2版)7.6 指针应用举例 #include#define N 6 int main(void) int flag(int,int); void output(int *,int); int s1,s2,i; static int r5; for(i=0;i=90) return 0; else if(ave=80) return 1; else if(ave=70) return 2; else if(ave=60) return 3; else return 4; void output(int *p,int n) int i; for(i=0;in;i+) printf(%d ,*(p+i); 7.6 指针应用举例 例7-16有红、黄、蓝、白、黑五种颜色的球若干个,每次取出三个球,打印出三种不同颜色球的可能取法。问题分析与算法设计 定义表示颜色的指针数组p,使其元素p0、p1、p

温馨提示

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

评论

0/150

提交评论