本次课内容:指针与数组 教学目的:掌握一维数组和二维数组指针表示,用指针对字符串操 作,掌握指针数。 重点:一、二维数组指针表示,字符串的操作方法。 难点:二维数组的指针表示。使用指针访问数组元素。 预习: 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]
四、指针与字符串 字符串操作:(1)字符串存放于数组中;(2)定义一个字符指针 1、字符指针的定义与赋值 char str|=“heo”;或str={“hell0”};* char *p; stre 2、字符串的输出 (1)字符串输出方法 printf(“%osⅦn”,str); 或: printf(“%sm”,p) (2)单字符输出方法 for(p=str;p!=“V0’;p++) pl rinf %c”,p) P193例611 3、字符查找函数 函数: strchr( str ch 在以str为首地址的字符串中查找ch字符,查找成功,得到ch字符的 地址,失败返回一个空指针
四、指针与字符串 字符串操作: (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字符的 地址,失败返回一个空指针
五、指针数组 指针数组:数组中每个元素是同类型的指针类型。即用来存放 批地址 2、主要用途:字符串操作,避免使用数组浪费存储空间 3、指针数组的定义 如:char*namt[2|={“ zhang”,“zhao”}; name0中存放的是“ zhang”串的首地址。 name[中存放的是“zha0”串的首地址。 name[0] 1000 100Q zh ang \ name 1006 1006z/h a0 如: char na[210={“ zhang ping”,” wang i”} na010001009→ zha g n g10 na[111012-ror2w a n g 使用字符指针数组存放字符串比用二维字符数组存放字符串字省内 存空间
五、指针数组 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 p n g \0 w a n g l i \0 1000 1012 1000 z h a n g 1012 na [0] na [1]
小结: 1、一维数组的指针表示 2、二维数组的指针表示 3、指向一维数组的指针变量 4、指针与字符串 5、指针数组 作业:P224~2263、15、19
小结: 1、一维数组的指针表示 2、二维数组的指针表示 3、指向一维数组的指针变量 4、指针与字符串 5、指针数组 作业:P224~226 __ 3、15、19