本次课内容:指针与数组 教学目的:掌握一维数组和二维数组指针表示,用指针对字符串操 作,掌握指针数。 重点:一、二维数组指针表示,字符串的操作方法。 难点:二维数组的指针表示。使用指针访问数组元素。 预习: 1、一维数组 定义了n个连续的存储单元(每个单元字节数由数据类型决定), 数组名是第一个单元的地址。 2、二维数组 数组可以看成是由n个元素组成的一维数组。其中每个元素又是由 m个元素组成的一维数组 3、地址、指针和指针变量 地址:存储区域(内存)中第一个字节的编号。 指针:变量的“地址”称为该变量的“指针” 指针变量:用来存放内存地址的变量称为指针变量
本次课内容:指针与数组 教学目的:掌握一维数组和二维数组指针表示,用指针对字符串操 作,掌握指针数。 重点:一、二维数组指针表示,字符串的操作方法。 难点:二维数组的指针表示。使用指针访问数组元素。 预习: 1、一维数组 定义了n个连续的存储单元(每个单元字节数由数据类型决定), 数组名是第一个单元的地址。 2、二维数组 数组可以看成是由n个元素组成的一维数组。其中每个元素又是由 m个元素组成的一维数组。 3、地址、指针和指针变量 地址: 存储区域(内存)中第一个字节的编号。 指针:变量的“地址”称为该变量的“指针” 指针变量:用来存放内存地址的变量称为指针变量
维数组的指针表示方法 在C函数中定义的数组名可以认为是一个存放地址值的指针变量名, 其中的地址是数组第一个元素的地址,但这个指针变量的地址值是 不改变的,因此,数组名是一个地址常数。 如:inta5; 假设a数组在内存中分配了如下连续空间。 a的地址为:1010a|0的地址为:1010 元素地址 内存空间元素占字节 a a0]1010 }2字节 a+1 [1]1012 2字节 a+2→a[2]1014 2字节 a+3 [3]1016 2字节 a+4 4]1018 2字节 1019
一、一维数组的指针表示方法 在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,a5={1,3,5,7,9}; printi(%d”,p); 注:指针变量要有初始地址,否则P值不确定。 使用指针法时,注意“下标是否真越界”,以防下标超界破坏 其它数据。 二维数组的指针表示方法 如:inta3l3]; a|0]|a1|a[2]a|3 a [0 a(0)a[1]a[2]a[] 2 a [01a[1]a[2] a [31
数组元素的引用方法: (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是常00二级一维数组a[是常量 一级一维数组 1000 a[O]+11002 a[o[1 a 1020 a+1 1020 a al a[1]+11022 al (a+1)+1 a为二级指针 a[i为一级指针 指向二级一维数组 指向一级一维数 1030 1030 a+2 al a[2]+11032 a[2[1l 1*(a+2)+1 注:a和a指针的基类型不同,即加1跳转的字节数不同
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,a33 在此定义中若0<=i<3,0<=j3,则a的地址可用以下五 种表达式求得: 引用 (1)&ajli aill (2)ai]+ (a[i]+j) (3)*(a+i)+j 六(*(a+i)+j) (4)&a|0|0]+32it+j 六(a[00]+3i+j) 5)a0]+3*i+j (2(a+i) 三、指向一维数组的指针变量 如:inta|35(p)|5l,*pl;为解决*p1不能存放a地址问题设(*p)5] p的基类型是一个包含有五个int元素的数组 p=a是合法的 p+1等价于a+1。(p+将跳过2×5个字节) (*(p+i)+j)等价于a[i[jlP 可以用以下形式引用a[i[j 12345 (1)“(p[i]+j) P+1→ 678910 (2)“((p+i)+j) P+2→ (3)((P+i)[j 11213|1415 (pili
如: 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 12 13 14 15 P P+1 P+2 *p+3 为解决*p1 不能存放a地址问题设(*p)[5]