XX秋新目标英语初一上unit9整单元同步课件_第1页
XX秋新目标英语初一上unit9整单元同步课件_第2页
XX秋新目标英语初一上unit9整单元同步课件_第3页
XX秋新目标英语初一上unit9整单元同步课件_第4页
XX秋新目标英语初一上unit9整单元同步课件_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

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

文档简介

第五章一维数组与一级指针第五章一维数组与一级指针问题:给一组数排序,这组数该如何存放呢???这些数据如何存放才便于排序82945637617188888888881111111111111118888888888?这便是本章所要解决的问题问题:给一组数排序,这组数该如何存放呢???这些数据如

5.1

一维数组的定义和引用

C语言为这些数据,提供了一种构造数据类型:数组。所谓数组就是一组具有相同数据类型的数据的有序集合。一个班学生的学习成绩一行文字一个矩阵这些数据的特点是:1.具有相同的数据类型2.使用过程中需要保留原始数据5.1一维数组的定义和引用C语言为这些数据,提1.一维数组的定义格式为:类型说明符数组名[常量表达式];例如:

inta[10];

它表示定义了一个整形数组,数组名为a,此数组有10个元素。

5.1.1一维数组的定义说明:

1.数组名定名规则和变量名相同,遵循标识符定名规则。1.一维数组的定义格式为:5.1.1一维数组的定义说明:2.在定义数组时,需要指定数组中元素的个数,方括弧中的常量表达式用来表示元素的个数,即数组长度。3.常量表达式中可以包括常量和符号常量,但不能包含变量。也就是说,C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。2.在定义数组时,需要指定数组中元素的个数,方括弧中的常量表例如:

intn;scanf(“%d″,&n);/*在程序中临时输入数组的大小*/inta[n];数组说明中其他常见的错误:①floata[0]; /*数组大小为0没有意义*/②intb(2)(3);/*不能使用圆括号*/③intk,a[k];/*不能用变量说明数组大小*/例如:intn;数组说明中其他常见的错误:2.一维数组在内存中的存放每个数据元素占用的字节数,就是基类型的字节数一个元素占4个字节一维数组:floatmark[100];mark[0]mark[1]mark[2]mark[3]...mark[99]86.592.077.552.0...94.0低地址

高地址2.一维数组在内存中的存放每个数据元素占用的字节数,就是基类注意:定义数组时用到的“数组名[常量表达式]”和引用数组元素时用到的“数组名[下标]”是有区别的。例如∶

inta[10];t=a[6];5.1.2一维数组元素的引用1.数组元素的引用方式数组名[下标]下标可以是整型常量或整型表达式。例如:a[0]=a[5]+a[7]-a[2*3]注意:5.1.2一维数组元素的引用1.数组元素的引用方式2.一维数组元素引用的程序实例#include<stdio.h>voidmain()

{inti,a[10];for(i=0;i<=9;i++)a[i]=i;for(i=9;i>=0;i--)printf("%d″,a[i]);printf("\n″);}

运行结果如下:9876543210

程序使a[0]到a[9]的值为0~9,然后按逆序输出。2.一维数组元素引用的程序实例#include<stdio对数组元素初始化的实现方法:1.在定义数组时对数组元素赋以初值。例如:inta[10]={0,1,2,3,4,5,6,7,8,9};将数组元素的初值依次放在一对花括弧内。经过上面的定义和初始化之后,a[0]=0,a[1]=1,a[2]=2,a[3]=3,a[4]=4,a[5]=5,a[6]=6,a[7]=7,a[8]=8,a[9]=9。

5.1.3一维数组的初始化对数组元素初始化的实现方法:1.在定义数组时对数组元素赋以3.如果想使一个数组中全部元素值为0,可以写成:

inta[10]={0,0,0,0,0,0,0,0,0,0};

或inta[10]={0};

不能写成:inta[10]={0*10};2.可以只给一部分元素赋值。例如:inta[10]={0,1,2,3,4};

定义a数组有10个元素,但花括弧内只提供5个初值,这表示只给前面5个元素赋初值,后5个元素值为0。3.如果想使一个数组中全部元素值为0,可以写成:2.4.在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。例如:inta[5]={1,2,3,4,5};

也可以写成inta[]={1,2,3,4,5};

inta[10]={1,2,3,4,5};只初始化前5个元素,后5个元素为0。4.在对全部数组元素赋初值时,由于数据的个数已经确定,因此例5.1:用数组来处理,求解Fibonacci数列。程序实例:#include<stdio.h>voidmain(){inti;intf[20]={1,1};Fibonacci数列公式:已知:a1=a2=1 an=an-1+an-2

即:1,1,2,3,5,8,135.1.4一维数组程序举例例5.1:用数组来处理,求解Fibonacci数列。程序实例for(i=2;i<20;i++)f[i]=f[i-2]+f[i-1];for(i=0;i<20;i++){if(i%5==0)printf(″\n″);printf(″%12d″,f[i])}/*For循环结束*/}/*程序结束*/运行结果如下:

11235813213455891442333776109871597258441816765if语句用来控制换行,每行输出5个数据。for(i=2;i<20;i++)运行结果如下:if语句用来程序举例:用起泡法对10个数排序(由小到大)。第一趟比较

经过第一趟(共5次比较与交换)后,最大的数9已“沉底”。然后进行对余下的前面5个数第二趟比较,程序举例:用起泡法对10个数排序(由小到大)。第经过第二趟比较如果有n个数,则要进行n-1趟比较。在第1趟比较中要进行n-1次两两比较,在第j趟比较中要进行n-j次两两比较。第如果有n个数,则要进行n-1趟比较。在第1趟比较中要进行n程序流程图如下:程序流程图如下:程序实例5.2:#include<stdio.h>voidmain(){inta[10];inti,j,t;printf(″input10numbers:\n″);for(i=0;i<10;i++)scanf("%d",&a[i]);printf("\n");程序实例5.2:for(j=0;j<9;j++)for(i=0;i<9-j;i++)if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}printf(″thesortednumbers:\n″);for(i=0;i<10;i++)printf(″%d″,a[i]);printf(″\n″);}/*程序结束*/程序运行结果如下:input10numbers:10481265-76100-45123↙

thesortednumbers:-76-4501481265100123for(j=0;j<9;j++)程序运行结果如下:5.2地址和指针的概念内存区的每一个字节有一个编号,这就是“地址”。如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。1.按变量地址存取变量值的方式称为“直接访问”方式printf(″%d″,i);scanf(″%d″,&i);k=i+j;5.2地址和指针的概念内存区的每一个字节有一个编号,这就是XX秋新目标英语初一上unit9整单元同步课件2.另一种存取变量值的方式称为“间接访问”的方式。即,将变量i的地址存放在另一个变量中。在C语言中,指针是一种特殊的变量,它是存放地址的。2.另一种存取变量值的方式称为“间接访问”的方式。即,将变一个变量的地址称为该变量的“指针”。例如,地址2000是变量i的指针。如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”。上述的i_pointer就是一个指针变量。指针和指针变量的定义:一个变量的地址称为该变量的“指针”。指针和指针变量的定义:

5.2

变量的指针和指向变量的指

针变量5.2.1定义一个指针变量定义指针变量的一般形式为基类型*指针变量名;5.2变量的指针和指向变量的指

针变量5.2下面都是合法的定义:float*pointer_3;

char*pointer_4;可以用赋值语句使一个指针变量得到另一个变量的地址,从而使它指向一个该变量。例如:pointer_1=&i;pointer_2=&j;下面都是合法的定义:在定义指针变量时要注意两点:指针变量前面的“*”,表示该变量的类型为指针型变量。例:float*pointer_1;指针变量名是pointer_1

,而不是*pointer_1

。(2)在定义指针变量时必须指定基类型。需要特别注意的是,只有整型变量的地址才能放到指向整型变量的指针变量中。下面的赋值是错误的∶

floata;int*pointer_1;pointer_1=&a;在定义指针变量时要注意两点:指针变量前面的“*”,表示该变量5.2.2指针变量的引用

注意:指针变量中只能存放地址(指针),不要将一个整数(或任何其他非地址类型的数据)赋给一个指针变量。

例5.3通过指针变量访问整型变量#include<stdio.h>void

main(){inta,b;

int*pointer_1,*pointer_2;a=100;b=10;

pointer_1=&a;/*把变量a的地址赋给

pointer_1*/

5.2.2指针变量的引用注意:指针变量中只能存放地址(指pointer_2=&b;/*把变量b的地址赋给

pointer_2*/printf(″%d,%d\n″,a,b);printf(″%d,%d\n″,*pointer_1,*pointer_2);}pointer_2=&b;/*把变量b的地址赋给对“&”和“*”运算符说明:如果已执行了语句pointer_1=&a;(1)&*pointer_1的含义是什么?

“&”和“*”两个运算符的优先级别相同,但按自右而左方向结合。因此,&*pointer_1与&a相同,即变量a的地址。如果有pointer_2=&*pointer_1;它的作用是将&a(a的地址)赋给pointer_2,如果pointer_2原来指向b,经过重新赋值后它已不再指向b了,而指向了a。对“&”和“*”运算符说明:XX秋新目标英语初一上unit9整单元同步课件(2)

*&a的含义是什么?

先进行&a运算,得a的地址,再进行*运算。*&a和*pointer_1的作用是一样的,它们都等价于变量a。即*&a与a等价。(3)(*pointer_1)++相当于a++。(2)*&a的含义是什么?(3)(*pointer_1)例5.4输入a和b两个整数,按先大后小的顺序输出a和b。#include<stdio.h>voidmain(){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\n″,a,b);

printf(″max=%d,min=%d\n″,*p1,*p2);}例5.4输入a和b两个整数,按先大后小的顺序输出#inclu运行情况如下:5,9↙

a=5,b=9max=9,min=5当输入a=5,b=9时,由于a<b,将p1和p2交换。交换前的情况见图(a),交换后见图(b)。运行情况如下:XX秋新目标英语初一上unit9整单元同步课件引入数组的目的:利用间接引用方式,访问一组数据。具体地说,从第一个数组元素的地址,计算出其他所有数组元素的地址,然后通过数组元素的地址,间接访问数组元素。定义一个数组:需要:(1)指定数组名,这个名称代表着第一个数组元素的指针,是一个指针常量,等价于一个指针字面值常量,称为数组指针(2)指定数组元素的类型,它是数组指针的基类型,是间接引用方式的基础(3)指定数组长度,即数组包含的元素个数,它决定了数组指针在进行加减整数的算术运算时的有效范围5.3一维数组名的双重含义引入数组的目的:利用间接引用方式,访问一组数据。具体地说,从5.3一维数组名的双重含义表5.1数组元素及元素地址的表示(数组定义:inta[5];)表示意义等价表示a数组第一个元素的地址,是指针常量&a[0]a+i(0≤i≤4)第i+1个元素的地址,是指针常量表达式,不可被修改&a[i]&a[i](0≤i≤4)a+i*(a+i)(0≤i≤4)第i+1个元素的间接引用表达,是基类型的变量a[i]a[i](0≤i≤4)第i+1个元素的下标(索引)表达,是基类型的变量*(a+i)总结:一维数组元素的地址有两种等价表示:a+i==&a[i];一维数组元素有两种等价表示:*(a+i)==a[i]5.3一维数组名的双重含义表5.1数组元素及元素地址的表示回顾:intm;--->m是一个整型变量的变量名,代表整型变量空间,m的类型标识为int同理:inta[5];--->a是一个数组变量的变量名,代表整个数组空间,a的类型标识为int[5]因此,数组名a有双重含义:(1)是一个数组变量的变量名,代表整个数组空间,在&a,sizeof(a)中体现该含义,但是数组变量不能通过其名称直接引用数组元素,因此数组名称“退化”了(2)是指向第一个数组元素的指针常量,所有元素的地址可根据该常量的地址值计算求得,从而方便实现间接访问数组的元素5.3一维数组名的双重含义回顾:intm;--->m是一个整型变量的变量名,代表整引入数组的目的:传递数组首元素地址,相当于传递整个数组空间所有元素的值。数组首元素地址可以传给?——基类型相同的指针变量指针变量的定义:回顾:整数类型int--->整型变量intx;同理:基类型为整型的指针类型int*--->指针变量int*x;一维数组名是指针常量,当然可以将值赋给基类型相同的指针变量,使指针变量和数组指针在间接引用方式下“共享”同一段数组空间,这相当于把数组空间的数据传给了指针变量,称为地址传递,例:inta[5];int*p=a;5.4一级指针变量与一维数组a[0]a[1]a[2]a[3]a[4]13ff58app[0]p[1]p[2]p[3]p[4]13ff58引入数组的目的:传递数组首元素地址,相当于传递整个数组空间所当p=a后,有下列等价关系存在:(1)数组元素的表示:下标法:p[i]等价于a[i]

间接引用法:*(p+i)等价于*(a+i)(2)数组元素地址的表示:

指针表达式法:p+i等价于a+i

元素取地址法:&p[i]等价于&a[i]注意:(1)p是变量,因此它有存储空间可以取地址,即&p是指向p存储空间的指针常量,其基类型为int*(2)p是变量,一般获得数组首元素地址值,也可以获得任意元素的地址值,例:p=&a[2]此时:p[0]等价于a[2],p[2]等价于a[4]程序5.5:用一级指针访问一维数组元素示例5.4一级指针变量与一维数组a[0]a[1]a[2]a[3]a[4]13ff58app[0]p[1]p[2]p[3]p[4]13ff5813ff60p[0]p[1]p[2]当p=a后,有下列等价关系存在:5.4一级指针变量与一维数组#include<stdio.h>intmain(){ inta[5]={10,15,20,25,30}; //数组初始化

inti,*p=a; //整型指针变量初始化等于a p[0]=-p[0]; //修改数组首元素的值,即a[0]=-10; p[1]=p[2]+p[3]; //修改数组第2个元素的值,即

a[1]=a[2]+a[3]; printf("printoutaddressandvalueofeachelementbyusingpointer:\n"); for(i=0;i<5;i++)//利用指针输出数组每个元素的地址及元素值

printf("&a[%d]=%x,a[%d]=%d\n",i,p+i,i,*(p+i)); printf("printoutaddressandvalueofeachelementbyusingarray:\n"); for(i=0;i<5;i++)//利用一维数组输出数组每个元素的地址及元素值

printf("&a[%d]=%x,a[%d]=%d\n",i,&a[i],i,a[i]); return0; }#include<stdio.h>一级指针变量定义时*的位置:情况1:只定义一个指针变量,此时*位置可以近基类型名、近变量名或居中三者均可例:int*p; int*p; int*p; 情况2:一条定义语句既定义基类型的变量,又定义指针变量,此时,*近指针变量例:inta,*p,b; 情况3:一条定义语句定义多个同类型的指针变量时,每个指针变量前都跟一个*号例:int*p,*q; 简单总结:(1)“*”贴近指针变量总是正确的(2)每个指针变量前面都必须有一个“*”5.4一级指针变量与一维数组近变量名近基类型名居中必须近变量名一级指针变量定义时*的位置:5.4一级指针变量与一维数组近变关于数组指针的基类型与指针变量基类型的一致性问题目的1:如果传递数组指针的目的是传递数组的值,那么应该将数组指针传递给同类型的指针变量,类型不同时虽然可通过强制类型转换赋值,但无意义例:inta[5]={10,15,20,25,30};double*pd;pd=(double*)a; float*pf;pf=(float*)a; 目的2:如果传递数组指针的目的在于高效使用内存资源,那么可以通过强制类型转换把该数组空间指针传递给其他类型的指针变量,把用过的数组空间用来存储其他类型的数据。程序5.6同一段空间,可用作不同类型的数组空间示例5.4一级指针变量与一维数组强制类型转换使赋值有效但无意义,因为pd+i≠a+i且pd[i]≠

a[i]

强制类型转换使赋值有效但无意义,因为虽然pf+i==a+i但pf[i]≠

a[i]

这样做虽然节省了空间,但是容易引起数据访问的歧义实际编程中这种方法不常用

关于数组指针的基类型与指针变量基类型的一致性问题5.4一级指#include<stdio.h>intmain(){ doubled[2];//定义长度为2的双浮点型数组dint*pi=(int*)d;//通过强制类型转换将double地址赋值给整型指针

d[0]=2.125;//通过双浮点型指针d访问双浮点型数组空间

d[1]=3.625; printf("%g\t%g\n",d[0],d[1]);//输出两个双浮点数组元素的值

pi[0]=17;//通过整型指针访问整型数组空间,长度为2的双浮

pi[1]=29; //点型数组空间可以用做长度为4的整型数组空间

printf("%d\t%d\n",pi[0],pi[1]);//输出前两个整型元素

printf("%g\t%g\n",d[0],d[1]);//输出两个双浮点数组元素的值

return0;}#include<stdio.h>5.4一级指针变量与一维数组一个基类型的变量等价于长度为1的数组定义inta[4];intn=5;分析的对象a&n对象的性质长度为4的整型数组指针常量长度为1的整型数组指针常量访问第一个元素a[0]==*(a+0)&n[0]==*(&n+0)=*(&n)=n若有int*p;给p的赋值p=a;p=&n;用p间接访问元素p[0]==*(p+0)=*pp[0]==*(p+0)=*p,直接用*p结论:intn,*p;则n相当于长度为1的数组&n的唯一元素,赋值给p之后,存在两组等价关系:p==&n;*p==n;但&n为常量,p为变量5.4一级指针变量与一维数组一个基类型的变量等价于长度为1的5.4一级指针变量与一维数组取址运算&和间接引用运算*互为逆运算二者都是第2优先级的运算符,结合方向为从右向左。需要注意,运算的每一步都要保证有意义。例:intn,m=5,*p=&m;则有5组等价关系:(1)p==&m;(2)*p=m;(3)&*p=p;(4)*&p=p(5)*&m=m但是:&*m=m;却是错误的,因为m不代表地址,所以*m无意义。5.4一级指针变量与一维数组取址运算&和间接引用运算*互为逆5.4一级指针变量与一维数组野指针:是指向”垃圾”内存的指针,有以下几种情况(1)指针变量没有被赋值,它存储的地址是不确定的例:int*p; *p=100; (2)指针操作超越了变量的作用范围例:inta[3],*p=a;p=p+3;*p=100; (3)一个字面值指针常量,例如(int*)0x12ff7c,如果其值0x12ff7c不是系统已经分配给用户程序使用的空间地址。因此一般编程时很少直接使用字面值指针常量进行间接引用(4)利用指针申请的动态空间被释放后,仍用该指针进行间接访问(具体见第6章6.5.3)一个没有赋值的“野”指针用“野”指针间接引用很危险指针获得数组首元素地址指针增加3,出了数组范围间接引用的空间不是程序的有效数据空间5.4一级指针变量与一维数组野指针:是指向”垃圾”内存的指针5.4一级指针变量与一维数组void型指针:称为通用指针或泛指针。可以把任何类型变量的地址赋给它,但是不能利用这样的指针做相应类型的访问或处理。例:void*p; intx=5;p=&x; //合法*p=6; //非法printf("%d",*p);

温馨提示

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

评论

0/150

提交评论