C程序设计11-用指针变量访问下标变量_第1页
C程序设计11-用指针变量访问下标变量_第2页
C程序设计11-用指针变量访问下标变量_第3页
C程序设计11-用指针变量访问下标变量_第4页
C程序设计11-用指针变量访问下标变量_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

第十一章用指针变量访问下标变量主要内容概述:用指针变量访问下标变量的原因及预备知识一2023/2/51用指针变量访问下标变量的方法二用指针变量访问下标变量的适用场合三通过指针变量访问下标变量的原因灵活数组名作为指针时,是不可改变的,所指对象是固定的指针变量所指对象可以改变效率高(不详细讲)特定情况下比较效率,需要汇编语言的知识效率其实差别不大有些地方不允许用数组名表示下标变量2023/2/52第一节概述for(i=0;i<=999999;i++)printf(“%d”,*(a+i));70.5870.3170.3070.18for(p=a,i=0;i<=999999;i++)printf(“%d”,*(p+i));70.0670.2669.5769.68for(p=a,i=0;i<=999999;i++)printf(“%d”,*(p++));70.4970.3269.6769.86for(p=a;p<=a+999999;p++)printf(“%d”,*p);70.8870.0670.1770.152023/2/53预备知识(知识回顾)1.用指针变量访问普通变量的方法主函数中定义指针变量inta,*p;使指针变量指向一个对象p=&a;间接访问*p=100;被调函数中intmain(){inta;

}voidf(){

}f(&a);............*p=100;......int*p第二节用到第三节用到第一节概述2023/2/54预备知识(知识回顾)2.数组名作为指针时,指向它的首元素一维数组的数组名,指向下标变量二维数组的数组名,指向一维数组三维数组的数组名,指向二维数组......3.数组中的下标变量在内存中是连续存放的4.指针的运算指针加1,指向下一个对象,指针减一,指向上一个对象指针增加(减少)一个值,仍然是指针,类型不变2023/2/55第二节用指针变量访问下标变量的方法用指针变量访问一维数组中的下标变量12本节主要内容用指针变量访问二维数组中的下标变量2023/2/56设有数组定义“inta[4];”,如何通过指针变量使a[0]变成100?通过指针变量访问普通变量的方法(主函数中)定义指针变量inta,*p;给指针变量赋值p=&a;间接访问*p=100;故访问下标变量a[0]的代码应是:定义指针变量inta[4],*p;给指针变量赋值p=&a[0];间接访问*p=100;11.2.1

用指针变量访问一维数组的下标变量//p=a;2023/2/57要访问a[0]、a[1]、a[2]...,如何操作?inta[4],*p;p=a;*p=100;*(p+1)=200;//a[1]=200;*(p+2)=300;//a[2]=300;......或者:

inta[4],*p;p=a;*p=100;p++;*p=200;p++;*p=300;......11.2.1

用指针变量访问一维数组的下标变量数组元素是连续存放的pp+1p+2p+3a[0]a[1]a[2]a[3]p访问a[0]的代码p指针加1,指向下一个对象2023/2/58练习:利用指针变量输出一维数组的所有元素解法1:inta[10]={1,2,3,4,5,6,7,8,9,0},*p,i;p=a;for(i=0;i<=9;i++)printf(“%3d”,*(p+i));

思考:若一开始让p指向a[1],能否输出所有元素的值?解法2:inta[10]={1,2,3,4,5,6,7,8,9,0},*p=a,i;for(i=0;i<=9;i++)printf(“%3d”,*(p++));解法3:inta[10]={1,2,3,4,5,6,7,8,9,0},*p;for(p=a;p<=a+9;p++)printf(“%3d”,*p);11.2.1

用指针变量访问一维数组的下标变量printf(“%3d”,*p);p++;*(p+i)也可以写成:p[i]2023/2/59例:输入10个整数存入数组,求和(通过指针变量)#include<stdio.h>intmain(){inta[10],i,sum=0,*p=a;for(i=0;i<=9;i++){scanf(“%d”,p);

sum+=*p;

p++;

}

printf(“%d\n”,sum);

return0;}

思考:循环结束时,p指向哪里?11.2.1

用指针变量访问一维数组的下标变量2000p2000200420082012......1sum0i1012320042008通过指针变量访问二维数组中下标变量的方法

inta[3][4],*p;p=&a[0][0];......//可访问任意一个下标变量

说明:上面的“p=&a[0][0];”,不要写成:

p=a;//会被警告。赋值后p指向什么?最简洁的写法是:

p=a[0];或

p=*a;

2023/2/51011.2.2

用指针变量访问二维数组的下标变量a[0][0]a[0][1]a[0][2]a[0][3]pp+1p+2p+3p20002000a[1][0]p+4例:用指针变量输出二维数组中各下标变量的值方法1:inta[2][3]={1,2,3,4,5,6},*p=a[0],i,j;for(i=0;i<=1;i++)for(j=0;j<=2;j++)printf(“%3d”,*(p+3*i+j));方法2:

inta[2][3]={1,2,3,4,5,6},*p=a[0],i;for(i=0;i<=5;i++)printf(“%3d”,*(p+i));//*(p+i)也可写成*(p++)方法3:inta[2][3]={1,2,3,4,5,6},*p;for(p=a[0];p<=a[0]+5;p++)printf(“%3d”,*p);2023/2/51111.2.2

用指针变量访问二维数组的下标变量p<=a[0]+5改成p<=a+5可否?结果会怎样?例:键盘输入三行字符,统计大写字母出现的次数#include<stdio.h>intmain(){chars[3][81],*p;inti,sum=0;for(i=0;i<=2;i++)gets(s[i]);for(i=0;i<=2;i++)for(p=s[i];*p!=0;p++)if(*p>=65&&*p<=90)sum++;printf(“%d\n”,sum);return0;}2023/2/51211.2.2

用指针变量访问二维数组的下标变量2023/2/513用指针变量访问下标变量的场合数组名作参数本节主要内容1第三节用指针变量访问下标变量的场合2voidf(...){............}2023/2/514讨论:在哪访问下标变量?在数组定义所在的函数中访问可用数组名访问可用指针变量访问在其他函数中访问仅使用,不修改

传递数组元素的地址(传一个地址即可:f(a))修改数据传值:无法修改传递地址(传一个地址即可:f(a))11.3.1

用指针变量访问下标变量的场合此时,就需要用变量地址作实参,指针变量作形参,通过指针变量访问下标变量intmain(){

inta[10];......}传递整个数组:f(a);//传递每个数组元素的值:f(a[0],a[1],a[2]…a[9])2023/2/515示意图:(以一维数组为例)

主调函数被调函数

intmain()sub(int*p){{inta[10]……sub(a);……}

}11.3.2

数组名作参数相当于执行:p=a;2023/2/516例:主函数定义数组inta[5]={3,5,2,8,6},编写被调函数以计算所有数据之和(仅使用,不修改)intsum(int*p)//参数传递后,p指向?{inti,s=0;//此s并非主函数中的sfor(i=0;i<=4;i++)s+=*(p++);returns;}intmain(){inta[5]={3,5,2,8,6},s;s=sum(a);//实参a即&a[0]printf(“%d\n”,s);return0;}11.3.2

数组名作参数2023/2/517例:主函数定义数组inta[5]={3,5,2,8,6},编写被调函数使数组中每个元素都变成原来的两倍(修改数据)voiddb(int*p)//参数传递后,p指向a[0]{inti;for(i=0;i<=4;i++)*p=*(p++)*2;}intmain(){inta[5]={3,5,2,8,6},i;db(a);//实参a,就是&a[0]for(i=0;i<=4;i++)printf(“%3d”,a[i]);return0;}11.3.2

数组名作参数2023/2/518上面两个例子中,形参“int*p”都可声明成

int

p[],两者等价voiddb(intp[])//p还是个指针变量{inti;for(i=0;i<=4;i++)*p=*(p++)*2;//p[i]=p[i]*2;}intmain(){inta[5]={3,5,2,8,6},i;db(a);for(i=0;i<=4;i++)printf(“%3d”,a[i]);return0;}11.3.2

数组名作参数2023/2/519关于intp[]和int*p等价的验证:intmain(){voidsub(int[]);inta[10]={1,3,5,2,7,9,6,8,0,4};printf(“%d,",sizeof(a));printf(“%p,",a);printf(“%p\n",&a);sub(a);printf("%p\n",a);return0;}voidsub(intx[]){printf("%d,",sizeof(x));printf("%p,",x);printf("%p,",&x);x++;printf("%p\n",x);}TC下的运行结果:20,FFCC,FFCC2,

FFCC,FFCA,FFCEFFCC11.3.2

数组名作参数2023/2/520例:主函数给inta[3][5]输入数据,被调函数找出最大数和最小数,存入主函数定义的变量中,主函数输出#include<stdio.h>voidsub(int*,int*,int*);intmain(){inta[3][5],max,min,i,j;for(i=0;i<=2;i++) for(j=0;j<=4;j++) scanf("%d",&a[i][j]);sub(a[0],&max,&min);

printf("%d,%d\n",max,min);return0;}11.3.2

数组名作参数2023/2/521voidsub(int*p,int*pmax,int*pmin){inti;*pmax=*pmin=*p;for(i=1;i<=14;i++){if(*pmax<p[i])*pmax=p[i];if(*pmin>p[i])*pmin=p[i];}}11.3.2

数组名作参数2023/2/522课外思考:下面程序的问题是什么?题目:二维数组存3人成绩,求总平均分

#include<stdio.h>

floataverage(int*,int);

int

温馨提示

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

评论

0/150

提交评论