数组与指针

文档属性

名称 数组与指针
格式 zip
文件大小 34.9KB
资源类型 教案
版本资源 通用版
科目 信息技术(信息科技)
更新时间 2010-09-16 19:33:00

图片预览

文档简介

(共21张PPT)
第九章 数组与指针
主要内容
9.1 一维数组与指针
9.2 二维数组与指针
9.1 一维数组与指针
9.1.1 一维数组首地址和数组元素的地址
9.1.2 通过指针引用一维数组元素
9.1 一维数组和指针
9.1.1 一维数组和数组元素的地址
一维数组在主存中占连续的存储空间,数组名代表的是数组的首地址。
可定义一个指针变量,通过赋值或赋初值的形式,把数组名或数组的第一个元素的地址赋值该指针变量,该指针变量就指向了该数组。
值得注意的是,这个指针变量中的地址值不可改变,也就是说,不可以给数组名重新赋值,因而数组名也可以认为是一个地址常量。
a [0]
a [1]
a [2]
a [3]
a [9]
...
整型指针p
&a [0]
a
若定义:
int a[10],*p,i;
数组元素a[0]----a[9],都可以看作是一个变量,因此每个数组元素均有一个地址:& a[i] (0<=i<=9)
使用p=&a[0]将指针p指向数据元素a[0],由于数组元素在内存中是连续的,则可以通过移动指针p来访问数组中的每个元素。
在C语言中,数组占用一串连续的存储单元,如:
C规定:数组名代表数组在内存中的起始地址,则a可表示数组a的首地址,也可使用p=a来让指针p指向数组a的起始地址。
a[0]
a[1]
a[2]
a[3]
a[9]
...
整型指针p
****
a
注:数组名是表示数组首地址的地址常量,永远指向a数组的首地址,不能对a重新赋值。
对于一维数组a,数组名a是数组元素a[0]的地址,即&a[0]与a是等值的。属性也相同,都是int 的地址。
&a[1]是数组元素的地址;
&a[2]是数组元素的地址;
&a[i](0<=i<=9有效)是数组元素的地址;
例: int a[10];
a++; a=&a[3];
9.1.1 一维数组首地址和数组元素的地址
设有: int i,a[10],*p,p1,p2;
则:
p=&i; (将变量i地址 p)
p=a; (将数组a首地址 p)
p=&a [i]; (将数组元素地址 p)
p1=p2; (指针变量p2值 p1)
不能把一个整数 p,也不能把p的值 整型变量
如 int i, *p;
p=1000; ( )
i=p; ( )
指针变量所指的变量的数据类型只能是它的基类型
a[0]
a[1]
a[2]
a[3]
a[9]
...
整型指针p
&a[0]
p
通过指针引用数组元素:
设: int a[10],*p;
p=&a[0];
则指针变量p指向了数组元素a[0],可使用间接访问运算符“*”来引用变量a[0]
如*p=18;等价于a[0]=18;
9.1.2 通过指针引用一维数组元素
例: main()
{ int a[5],*p, i;
for(p=a, i=0;i<5;i++)
scanf( “%d”, p+i);
for(p=a;pprintf (“%d”,*p);
}
通过数组首地址引用数组元素:
设: int a[10];
因a表示数组a的首地址,可把a当作是一个指针常量。
则: *a 等价于a[0]
*(a+1)等价于a[1]……
a 等价于&a[0]
a+1 等价于&a[1]……
例: main()
{ int a[5],i;
for(i=0;i<5;i++)
scanf( “%d”, a+i);
for(p=a;pprintf (“%d”,*(a+i));
}
//a是指针常量,不能使用a++对a进行移动
用带下标的指针变量引用一维数组元素:
设有: int *p,a[5];
p=a;
我们可使用p[0]表示p指针指向的内存单元,p[1]表示p指针指向的内存单元的下一个内存单元,则可使用p[0]表示a[0],p[1]表示a[1]……
例: main()
{ int a[10]={1,2,3,4,5,6,7,8,9,10},*p=&a[3],*q=p+2;
printf (“%d\n”,*p+*q);
}
输出结果:10
例: main()
{ int i, s=0,t[]={1,2,3,4,5,6,7,8,9};
for( i=0;i<9;i+=2) s+=*( t+i );
printf (“%d\n”, s);
}
输出结果:25
9.2 二维数组与指针
9.2.1 二维数组首地址和数组元素的地址
9.2.2 指针数组与二维数组
9.2.3 行指针
9.2.4 指针数组与行指针的区别
对于一维数组:
数组名a表示数组的首地址,即a [0]的地址
数组名a 是地址常量
a+i是元素a [i]的地址
a [i] *(a +i)
这些同样可以运用于二维数组。
a
int a[10];
9.2.1 二维数组首地址和数组元素的地址
任何一个二维数组由若干个一维数组组成
对于二维数组:
(1)a是数组名,
包含三个元素
a[0],a[1],a[2]
(2)每个元素a[i]
又是一个一维
数组,包含4个
元素
a
a+1
a+2
*(*(a+0)+1)
*(a[0]+1)
int a[3][4];
a[0]
a[1]
a[2]
2000
2008
2016
2000
2002
2008
2010
2016
2018
a[0][0]
a[0][1]
a[1][0]
a[1][1]
a[2][0]
a[2][1]
a[0][2]
a[0][3]
a[1][2]
a[1][3]
a[2][2]
a[2][3]
基类型
a[0]+1
a[1]+1
a[2]+1
*(a+0)+1
*(a+1)+1
*(a+2)+1
设有:int a[3][4], *p;
对二维数组 int a[3][4],有
a-----二维数组的首地址,即第0行的首地址,地址常量,不能进行赋值运算。
a+i-----第i行的首地址
a[i] *(a+i)------第i行第0列的元素地址
a[i]+j *(a+i)+j -----第i行第j列的元素地址
*(a[i]+j) *(*(a+i)+j) a[i][j]
a+i=&a[i] <------- a[i]=*(a+i) =&a[i][0],
值相等,含义不同
a+i &a[i],表示第i行首地址,指向行
a[i] *(a+i) &a[i][0],表示第i行第0列元素地址,指向列
int a[3][4];
a[0]
a[1]
a[2]
2000
2008
2016
2000
2002
2008
2010
2016
2018
a[0][0]
a[0][1]
a[1][0]
a[1][1]
a[2][0]
a[2][1]
a[0][2]
a[0][3]
a[1][2]
a[1][3]
a[2][2]
a[2][3]
a
a+1
a+2
二维数组名也是一个地址常量
int a[3][4];
a[0][0]
a[0][1]
a[1][0]
a[1][1]
a[2][0]
a[2][1]
a[0][2]
a[0][3]
a[1][2]
a[1][3]
a[2][2]
a[2][3]
二维数组元素表示形式:
(1)a[1][2]
(2)*(a[1]+2)
(3)*(*(a+1)+2)
(4)*(&a[0][0]+1*4+2)
地址表示:
(1) a+1
(2) &a[1][0]
(3) a[1]
(4) *(a+1)
(5)(int *) (a+1)
属性为行指针
属性为元素指针
地址表示:
(1) &a[1][2]
(2) a[1]+2
(3) *(a+1)+2
(4)&a[0][0]+1*4+2
二维数组元素及地址
int a[3][4];
a[0]
a[1]
a[2]
2000
2008
2016
2000
2002
2008
2010
2016
2018
a[0][0]
a[0][1]
a[1][0]
a[1][1]
a[2][0]
a[2][1]
a[0][2]
a[0][3]
a[1][2]
a[1][3]
a[2][2]
a[2][3]
a
a+1
a+2
表示形式
含义
地址
a
二维数组名,数组首地址
a[0],*(a+0),*a
第0行第0列元素地址
a+1
第1行首地址
a[1],*(a+1)
第1行第0列元素地址
a[1]+2,*(a+1)+2,&a[1][2]
第1行第2列元素地址
*(a[1]+2),*(*(a+1)+2),a[1][2]
第1行第2列元素值
2000
2000
2008
2008
2012
13
9.2.2 指针数组与二维数组
指针数组
定义形式:类型名 *指针数组名[常量表达式]
例:int *p[3]
定义了一个具有三个元素的一维数组,其中每个元素只能存放指针,这些指针的基类型为整型,故称p为指针数组
说明:[]的优先级高于*的优先级,则*p[3]中,p先与[]结合,构成p[3],说明p是一个数组名; *说明数组p中的每个元素只能存放指针
p[0]
p[2]
p[1]
定义指针数组
通过指针数组引用二维数组元素
例:
int *p[3],a[3][4],i,j;
for( i=0;i<3;i++) p[i]=a[i];
p[i]的基类型与a[i]的基类型相同
赋值号右边的a[i]代表a数组每行的首地址。
赋值号左边的p[i]是指针变量。
循环执行的结果是使p数组中的每个元素指向了a数组每行的开头。
当数组p中的每个元素指向a数组每行的开头时,则a数组中的元素:
a [i] [j] *(a [i] + j) *( p [i] +j)
例 有以下程序段:
int a[3][2]={1,2,3,4,5,6},*p[3];
p[0]=a[1];
则*(p[0]+1)所代表的数组元素是:
输出结果:a[1][1]
int a[3][4];
a[0][0]
a[0][1]
a[1][0]
a[1][1]
a[2][0]
a[2][1]
a[0][2]
a[0][3]
a[1][2]
a[1][3]
a[2][2]
a[2][3]
p[0]
p[1]
p[2]
定义行指针
定义形式:数据类型 (*指针数组名)[常量表达式];
例 int (*p)[4];
( )不能少
int (*p)[4]与int *p[4]不同
p的值是一维数组的
首地址,p是行指针
可让p指向二维数组某一行
如:
int a[3][4], (*p)[4]=a;
p[0]+1或 *p+1
p[1]+2或 *(p+1)+2
*(*p+1)或 (*p)[1]
*(*(p+1)+2)
一维数组指针变量维数和
二维数组列数必须相同
9.2.3 行指针
定义了一个指针变量p,p只能存放含有四个整型元素的一维数组首地址。
int a[3][4];
a[0][0]
a[0][1]
a[1][0]
a[1][1]
a[2][0]
a[2][1]
a[0][2]
a[0][3]
a[1][2]
a[1][3]
a[2][2]
a[2][3]
p
p
p
int a[3][4];
a[0][0]
a[0][1]
a[1][0]
a[1][1]
a[2][0]
a[2][1]
a[0][2]
a[0][3]
a[1][2]
a[1][3]
a[2][2]
a[2][3]
a
a+1
a+2
p
p+1
p+2
9.2.4 指针数组与行指针的区别
int *p[3]:表示一个数组,它含有三个元素p[0]、p[1]、p[2]、p[4],且这三个元素只能存放整型元素的地址。
int (*p)[4]:表示一个指针变量,它仅有一个存储空间,只能存放一个长度为4的一维数组的指针。
例: int *p[3],a[3][4],i;
for( i=0;i<3;i++) p[i]=a[i];
int a[3][4];
a[0][0]
a[0][1]
a[1][0]
a[1][1]
a[2][0]
a[2][1]
a[0][2]
a[0][3]
a[1][2]
a[1][3]
a[2][2]
a[2][3]
p[0]
p[1]
p[2]
例: int (*p)[4],a[3][4],i,j;
for( i=0;i<3;i++) p=&a[i];
int a[3][4];
a[0][0]
a[0][1]
a[1][0]
a[1][1]
a[2][0]
a[2][1]
a[0][2]
a[0][3]
a[1][2]
a[1][3]
a[2][2]
a[2][3]
p
p
p
同课章节目录