![指针与数组课件讲解_第1页](http://file4.renrendoc.com/view4/M02/09/26/wKhkGGaaYjKANL6DAADUE9ReOT0259.jpg)
![指针与数组课件讲解_第2页](http://file4.renrendoc.com/view4/M02/09/26/wKhkGGaaYjKANL6DAADUE9ReOT02592.jpg)
![指针与数组课件讲解_第3页](http://file4.renrendoc.com/view4/M02/09/26/wKhkGGaaYjKANL6DAADUE9ReOT02593.jpg)
![指针与数组课件讲解_第4页](http://file4.renrendoc.com/view4/M02/09/26/wKhkGGaaYjKANL6DAADUE9ReOT02594.jpg)
![指针与数组课件讲解_第5页](http://file4.renrendoc.com/view4/M02/09/26/wKhkGGaaYjKANL6DAADUE9ReOT02595.jpg)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章指针学习目标掌握定义指针的方法,掌握指针的基本操作;掌握利用指针作为函数参数传递数据的方法;掌握一维数组指针和行指针的概念和应用主要内容指针的概念指针变量的定义指针的基本操作指针变量的简单应用指针作为函数参数一维数组的指针行指针
7.3指针和数组一.一维数组的指针1.一维数组指针的概念在C语言中,一维数组的数组名表示数组存放的首地址,称其为数组的指针。显然,该指针与数组首元素的指针有相同的值。2000H52004H42008H3200CH22010H1定义一维数组intarr[5]={5,4,3,2,1};并假定数组在内存中从2000H开始存放。则:数组名arr就是数组arr的指针,arr的值为数组的存储地址2000H。显然,数组元素arr[0]的指针也是2000H,数组元素arr[1]的指针是2002H,……。在C程序中,执行语句:printf("%x",arr);
即可输出一维数组arr的指针。一维数组指针和数组元素指针的关系
数组名+i指向数组第i个元素例如:arr是数组arr[]的指针,则
arr+i指向数组arr[]的第i个元素,即:
arr+i=&arr[i]【例7-6】从键盘输入10个整数,然后逆序输出。
#include<stdio.h>
voidmain()
{inta[10],i,*p;printf("PleaseinputtenIntegers:\");for(i=0;i<=9;i++)scanf("%d",a+i);for(p=a+9;p>=a;p--)printf("%d,",*p);printf("\n");}
注意:(1).指针变量可以施行自加、自减运算,p++或++p使指针变量指向数组当前元素的下一个元素,而p--或--p使指针变量指向数组当前元素的前一个元素。(2).数组名a是数组的首地址,是一个常量,所以不可以施行自加、自减运算。(3).如果指针变量p指向数组的某一个元素a[i],则*p++表示读取a[i]的值后,再使p指向a[i+1]。可以类似地理解*p--。(4).如果指针变量p指向数组的某一个元素a[i],则--*p表示先使p指向a[i-1],再读取a[i-1]的值。可以类似地理解++*p。(5).如果指针变量p指向数组的某一个元素a[i],则(*p)++表示读取a[i]的值后,执行a[i]+=1,而p的指向不变。可以类似地理解(*p)--。
(6).*p++和*(p++)、*p--和*(p--)的运算结果是一样的。【例7-7】从键盘输入5个数,输出其中的最大值和最小值。#include<stdio.h>intmax,min;voidf(int*arr,intn)
{int*p,*arr_end;arr_end=arr+n;max=min=*arr;for(p=arr+1;p<arr_end;p++){if(*p>max)max=*p;elseif(*p<min)min=*p;}}main(){inti,a[5],*p1=a;printf("PleaseInputFiveIntegers:\n");for(;p1<a+5;p1++)scanf("%d",p1);p1=a;f(p1,5);printf("max=%d,min=%d\n",max,min);}形式参数为指针变量实在参数为指针数组名就是数组的指针二.二维数组的指针1.行指针的概念
二维数组的数组名表示数组存储的首地址。例如,定义二维数组:inta[3][4]={{2,4,6,8},{10,12,14,16},{18,28,22,24}};设数组a存储在从2000H开始的存储单元中。(图中假设int占2字节)
数组名a指向数组存储的首地址2000H。但a+1不是指向a[0][1]的存储单元,而是指向二维数组第1行的存储首地址2008H,a+2指向二维数组第2行的存储首地址2010H..….。确切地说,数组名a指向二维数组第0行的存储首地址2000H。注意:
称二维数组各行的存储首地址为该行的行指针,是以二维数组的行为存储单位的地址。二维数组的行指针和数组元素指针的关系
*(数组名+i)+j指向二维数组第i行、第j列的元素而*(*(数组名+i)+j)即是取出第i行、第j列的元素值。例如:a是二维数组a[]的行指针,则*(a+i)+j指向数组a[]的第i行、第j列的元素,即:*(a+i)+j=&a[i][j]
而:*(*(a+i)+j)即是取出a[i][j]的值。为了使用行指针,需要定义行指针变量。定义行指针变量的格式:类型说明符(*行指针变量名)[数组的列元素个数];对二维数组a[3][4],定义行指针变量:int(*p)[4];
其中:(*p)表示p是行指针变量,[4]表示该行指针变量指向的行有4个列元素,int表示二维数组的元素为整型变量。【例7-8】以二种不同的方式输出数组元素a[i][j]的存储单元地址和值。#include<stdio.h>voidmain()
{inta[2][2]={{2,4},{6,8}},i,j;int(*p)[2]=a;for(i=0;i<=1;i++)for(j=0;j<=1;j++){printf("Address1ofa[%d][%d]is%x",i,j,*(p+i)+j);printf("a[%d][%d]=%d\n",i,j,*(*(p+i)+j));printf("Address2ofa[%d][%d]is%x",i,j,*(a+i)+j);printf("a[%d][%d]=%d\n",i,j,*(*(a+i)+j));}}用二维数组a的数组名a对行指针变量p作初始化行指针的方法输出数组元素a[i][j]的指针和值
用二维数组名的方法输出数组元素a[i][j]的指针和值【例7-9】用行指针的方法计算并输出二维数组a各行元素的和。
#include<stdio.h>
voidmain()
{inta[3][4]={{2,4,6,8},{10,12,14,16},{18,20,22,24}};int(*p)[4]=a,i=0,j;for(p=a;p<=a+2;p++,i++){intsum=0;for(j=0;j<=3;j++)sum+=*(*p+j);printf("SumofRow%dis%d\n",i,sum);}}【例7-10】用访问一维数组的方法输出二维数组所有元素的和。
#include<stdio.h>
voidmain()
{inta[3][4]={{2,4,6,8},{10,12,14,16},{18,20,22,24}};inti,j,sum=0,*p=&a[0][0];for(i=0;i<=2;i++)for(j=0;j<=3;j++)sum+=*(p+i*4+j);printf("SUM=%d\n",sum);}用二维数组a[][]元素a[0][0]的地址对指针变量p作初始化,p+1指向a[0][1]……【例7-13】通过函数调用求二行四列矩阵的最大元素值。#include<stdio.h>
intmax(int(*p)[4]){inti,j,m;m=**p;for(i=0;i<=1;i++)for(j=0;j<=3;j++)if(*(*(p+i)+j)>m)m=*(*(p+i)+j);return(m);}main(){inta[2][4],i,j;printf("PleaseInputEightIntegers:\n");for(i=0;i<=1;i++)for(j=0;j<=3;j++)scanf("%d",&a[i][j]);printf("MAX=%d\n",max(a));}形参为行指针变量即:*(*(p+0)+0)实参为二维数组的数组名
三、字符串的指针
字符串的指针就是字符串在内存存储区域中的起始地址,存放该字符串的字符数组名就是其指针。例如:定义一字符串:chars[]="IloveChina.";
那么,字符数组名s就是该字符串的指针。通过指针变量,既可以访问整个字符串,也可以访问字符串中的某个字符。【例7-14】通过字符数组名和指针变量访问字符串。#include<stdio.h>voidmain(){chars[]="IloveChina.",*p;inti;for(i=0;s[i]!=’\0’;i++)printf("%c",s[i]);printf("\n");puts(s);
for(p=s;*p!=’\0’;p++)printf("%c",*p);printf("\n")p=s;puts(p);}使字符指针变量p重新指向字符串s的首地址
【例7-14-1】通过字符数组名和指针变量访问字符串。#include<stdio.h>
voidmain(){char*p="IloveChina.",*p1=p;inti;for(i=0;*(p+i)!=’\0’;i++)printf("%c",*(p+i));printf("\n");puts(p);for(p=p1;*p!=’\0’;p++)printf("%c",*p);printf("\n");p=p1;puts(p);}直接使用字符型指针变量p指向字符串的首地址【例7-15】通过函数调用,将字符串1中从第m个字符开始的全部字符复制成字符串2。要求在主函数中输入字符串1和m的值,并输出复制结果。
#include<stdio.h>#include<string.h>voidcopys(char*,char*,int);main(){intm;chars1[80],s2[80];printf(“Pleaseinputastring:\n”);gets(s1);printf(“pleaseinputanintegerm:\n”);scanf(“%d”,&m);if(strlen(s1)<m)printf(“Errorm!\n”);else{copys(s1,s2,m);printf(“Resultis:%s\n”,s2);}}(后续)
voidcopys(char*p1,char*p2,inti){intn=0;while(n<i-1){p1++;n++;}while(*p1!=’\0’){*p2=*p1;p1++;p2++;}*p2=’\0’;}(接前)四、指针数组一个数组,如果其元素均为指针变量,则称之为指针数组。指针数组的定义格式:类型说明符*数组名[数组长度];
说明:格式中的类型说明符是指针数组中的指针变量所指向的数据类型。
例如,语句:int*p[4];
定义了一个有四个元素组成的数组p,每一个元素p[i],(i=0,1,2,3)都是指向整型数据的指针变量。【例7-16】将若干字符串按字母顺序(由小到大)输出。
#defineN4#include<string.h>voidsort(char*s[],intn){char*temp;inti,j,k;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++)if(strcmp(s[k],s[j])>0)k=j;if(k!=i){temp=s[i];s[i]=s[k];s[k]=temp;}}}(后续)形参为指针数组s[k],s[j]为指针变量
voidout(char*s[],intn){inti;for(i=0;i<n;i++)printf("%s\n",s[i]);}mainO{char*str[N]={"CHINA","FRANCE","RUSSIA","AMERICA"};sort(str,N);out(str,N);}(接前)实参为指针数组名初始化时指针数组中的指针变量依次指向每一个字符串
调用sort()函数前调用sort()函数后
str[0]"CHINA"str[0]"CHINA"
str[1]"FRANCE"str[1]"FRANCE"str[2]"RUSSIA"str[2]"RUSSIA"
str[3]"AMERICA"str[3]"AMERICA"字符串排序前后指针数组元素的指向
7.4指针与函数一、指向函数的指针在C程序中定义的函数,系统编译时会为函数代码分配一段连续的存储空间,这段存储空间的起始地址(又称入口地址)称为这个函数的指针。而函数名就代表该函数所占存储空间的首地址。可以把函数的首地址赋给一个指向该函数的指针变量,通过该指针变量就可以调用这个函数。把这种指向函数的指针变量称为“函数指针变量”。函数指针变量定义的格式为:
类型说明符(*指针变量名)(形式参数表列);【例7-17】用函数指针变量调用函数。#include<stdio.h>
intmax(intx,inty)
{
returnx
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 短视频行业发展监测及投资战略规划研究报告
- 2025年服装饰带行业深度研究分析报告
- 2025年工艺扇印刷项目投资可行性研究分析报告
- 物资申请书格式
- 2025年中国梳子行业发展全景监测及投资方向研究报告
- 大学生创新课题申请书
- 2025年度智慧城市合伙企业入伙合同
- 小孩子户口申请书
- 2025年度中小企业过桥贷款扶持合同
- 2025年度互联网金融出借平台合作协议4篇
- (正式版)HGT 6313-2024 化工园区智慧化评价导则
- 单县烟草专卖局QC课题多维度降低行政处罚文书出错率
- 毫针刺法(全)教学课件
- 金风科技-风电产业集团-供应商现场作业基础安全考试附答案
- 公共关系学完整教学课件
- 人工智能机器人科学小报手抄报简报
- 三年级下册美术课件-第1课 灯彩辉映|浙美版 (共19张PPT)
- 硫酸铵废水MVR蒸发结晶
- 原子物理学第五章-多电子原子:泡利原理
- 35kV输电线路工程旋挖钻孔专项施工方案
- 固定资产借用登记表
评论
0/150
提交评论