本次课内容:指针与数组
教学目的:掌握一维数组和二维数组指针表示,用指针对字符串操
作,掌握指针数。
重点:一、二维数组指针表示,字符串的操作方法。
难点:二维数组的指针表示。使用指针访问数组元素。
预习,
1、一维数组
定义了 n个连续的存储单元(每个单元字节数由数据类型决定),
数组名是第一个单元的地址。
2、二维数组
数组可以看成是由 n个元素组成的一维数组。其中每个元素又是由
m个元素组成的一维数组。
3、地址、指针和指针变量
地址,存储区域(内存)中第一个字节的编号。
指针:变量的“地址”称为该变量的“指针”
指针变量:用来存放内存地址的变量称为指针变量。
一、一维数组的指针表示方法
在 C函数中定义的数组名可以认为是一个存放地址值的指针变量名,
其中的地址是数组第一个元素的地址,但这个指针变量的地址值是
不改变的,因此,数组名是一个地址常数 。
如,int a[5];
假设 a 数组在内存中分配了如下连续空间。
a 的地址为,1010 a[0] 的地址为,1010
内存空间
2字节
2字节
2字节
2字节
2字节
a[0]
a[1]
a[2]
a[3]
a[4]
1010
1012
1014
1016
1018
1019
地址 元素 元素占字节
a
a+1
a+2
a+3
a+4
数组元素的引用方法,
(1)下标法,a[i]
(2)地址法,*(a+i)
(3)用指针变量,int *p,a[5]={1,3,5,7,9};
p=a;
printf(“%d”,*p);
注:指针变量要有初始地址,否则 P值不确定。
使用指针法时,注意“下标是否真越界”,以防下标超界破坏
其它数据。
二、二维数组的指针表示方法
如,int a[3][3];
a [0]
a [1]
a [2]
a [0] a [1] a[2] a [3]
a [0] a [1] a[2] a [3]
a [0] a [1] a[2] a [3]
a
a[0][0]
a[0][1]
a[1][0]
a[1][1]
a[2[0]
a[2][1]
a[0]
a[1]
a[2]
1000
1002
1020
1022
1030
1032
a
a+1
a+2
1000
1020
1030
a[0]+1
a[1]+1
a[2]+1
*a+1
*(a+1)+1
*(a+2)+1
a为二级指针
指向二级一维数组
a[i]为一级指针
指向一级一维数组
二级一维数组 一级一维数组 a是常量 a[i]是常量
注,a和 a[i]指针的基类型不同,即加 1跳转的字节数不同。
如,int *p,a[3][3];
在此定义中若 0<=i<3,0<=j<3,则 a[i][j]的地址可用以下五
种表达式求得,引用
(1) &a[i][j] a[i][j]
(2) a[i]+j *(a[i]+j)
(3) *(a+i)+j *(*(a+i)+j)
(4) &a[0][0]+3*i+j *(&a[0][0]+3*i+j )
(5) a[0]+3*i+j ( *(a+i))[j]
三、指向一维数组的指针变量
如,int a[3][5],(*p)[5],*p1;
p 的基类型是一个包含有五个 int 元素的数组
p = a 是合法的。
p+1 等价于 a+1。 (p+1将跳过 2× 5个字节)
*( *(p+i)+j) 等价于 a[i][j]
可以用以下形式引用 a[i][j],
(1) *(p[i]+j)
(2) *(*(p+i)+j)
(3) (*(p+i))[j]
(4) p[i][j]
1 2 3 4 5
6 7 8 9 10
11 13 12 14 15
P
P+1
P+2
*p+3
为解决 *p1 不能存放 a地址问题设 (*p)[5]
四、指针与字符串
字符串操作, (1)字符串存放于数组中; (2)定义一个字符指针。
1、字符指针的定义与赋值
char str[ ]=“hello”; /*或 str[ ]={“hello”};*/
char *p;
p=str;
2、字符串的输出
(1)字符串输出方法
printf(“%s \n”,str);
或,printf(“%s \n”,p);
(2)单字符输出方法
for (p=str;*p!=?\0?;p++)
printf(“%c”,*p);
P193——例 6.11
3、字符查找函数
函数,strchr(str,ch)
在以 str为首地址的字符串中查找 ch字符,查找成功,得到 ch字符的
地址,失败返回一个空指针。
五、指针数组
1、指针数组:数组中每个元素是同类型的指针类型。即用来存放
一批地址。
2、主要用途:字符串操作,避免使用数组浪费存储空间。
3、指针数组的定义
如,char *name[2]={“zhang”,“zhao”};
name[0] 中存放的是,zhang”串的首地址。
name[1]中存放的是,zhao”串的首地址。
如,char na [2][10]={“zhang ping”,”wang li”};
使用字符指针数组存放字符串比用二维字符数组存放字符串字省内
存空间。
name[0]
name[1]
z h a n g \0
z h a o \0
1000
1006
1000
1006
i n p g \0
w l a g n i \0
1000
1012
z h a g n 1000
1012
na [0]
na [1]
小结,
1、一维数组的指针表示
2、二维数组的指针表示
3、指向一维数组的指针变量
4、指针与字符串
5、指针数组
作业,P224~226 __ 3,15,19。