资源描述:
《《c语言程序设计教学资料》第11章---指针与数组ppt课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第11章数组与指针数组与指针指针和一维数组指针和二维数组动态内存分配函数数组与指针一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中)。数组元素的指针就是数组元素的地址。可以用一个指针变量指向一个数组元素inta[10]={1,3,5,7,9,11,13,15,17,19};int*p;p=&a[0];等价于p=a;等价于int*p=a;或int*p=&a[0];注意:数组名a不代表整个数
2、组,只代表数组首元素的地址。p=a;的作用是“把a数组的首元素的地址赋给指针变量p”,而不是“把数组a各元素的值赋给p”。指针与一维数组在引用数组元素时指针的运算在指针指向数组元素时,允许以下运算:加一个整数(用+或+=),如p+1减一个整数(用-或-=),如p-1自加运算,如p++,++p自减运算,如p--,--p两个指针相减,如p1-p2(只有p1和p2都指向同一数组中的元素时才有意义)如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素,p-1指向同一数组中的上一个元素。例:floata[
3、10],*p=a;假设a[0]的地址为2000,则:p的值为2000p+1的值为2004p-1的值为1996越界如果p的初值为&a[0],则p+i和a+i就是数组元素a[i]的地址,或者说,它们指向a数组序号为i的元素*(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a[i]。a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]pp+1,a+1p+i,a+ip+9,a+9*(p+i)通过指针引用数组元素引用一个数组元素,可以用:(1)下标法,如a[i]形式;(2)指针法,如*
4、(a+i)或*(p+i);其中a是数组名,p是指向数组元素的指针变量,其初值p=a。例:输出数组中的全部元素。假设inta[5],要输出各元素的值有四种方法:(1)下标法。(2)通过数组名计算数组元素地址,找出元素的值。(3)用指针变量指向数组元素。虽然p和a的值都是数组的首地址,但是数组名a不能执行增1或减1操作。因为数组名是指针常量,代表一个地址常量,其值不能改变;指针是变量,其值可以改变。3种方法的比较:①第(1)和第(2)种方法执行效率相同C编译系统是将a[i]转换为*(a+i)处理的,即先计算元素地址。因
5、此用第(1)和第(2)种方法找数组元素费时较多。②第(3)种方法比第(1)、第(2)种方法快用指针变量直接指向元素,不必每次都重新计算地址,像p++这样的自加操作是比较快的这种有规律地改变地址值(p++)能大大提高执行效率③用下标法比较直观,能直接知道是第几个元素。用地址法或指针变量的方法不直观,难以很快地判断出当前处理的是哪一个元素。(4)指针的下标法数组名和指针变量作函数参数a+i*(a+i));被调函数的形参声明为数组类型,用指针法访问数组元素指针与二维数组二维数组可以看作一维数组,其每个数组元素又是一个一维
6、数组a[0][0]a[0][1]a[0][2]aa[0]a[1]a[1][0]a[1][1]a[1][2]a[0][0]a[0][1]a[0][2]aa[0]a[1]a[1][0]a[1][1]a[1][2]a[0]可以看做3个短整型元素组成的一维数组的数组名a[0][0]a[0][1]a[0][2]a[0]a[1]a[1][0]a[1][1]a[1][2]如果将二维数组名a看成一个行地址(第0行),则a+i表示二维数组第i行的地址,a[i]可看成一个列地址,即第i行第0列的地址。行地址a加1(a+1),表示指向下
7、一行;列地址a[i]加1(a[i]+1),表示指向下一列二维数组的行指针与列指针i<2;j<3;i<2;j<3;注:m×n个元素的二维数组inta[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};1357911131517192123a[0]a[1]a[2]aa+1a+2a[0]a[0]+1a[0]+2a[0]+3行指针列指针a代表第0行首地址a+1代表第1行首地址a+2代表第2行首地址1357911131517192123a[0]a[1]a[2]aa+1a+2a[0]a[
8、0]+1a[0]+2a[0]+3行指针列指针行指针每加1,走一行a+i代表行号为i的行首地址(按行变化)*(a+i)代表什么?1357911131517192123a[0]a[1]a[2]aa+1a+2a[0]a[0]+1a[0]+2a[0]+3行指针列指针相当于a[i]a[0]代表a[0][0]的地址a[0]+1代表a[0][1]的地址a[0]+2代表a[