授课日期
年级、专业
    题:  数组格式字符串转数组8 善于利用指针                                               
                                                                       
      讲授+上机                                                             
目的要求:  1掌握指针变量                                                           
            2掌握返回函数的指针                                                     
                                                                             
                                                                                                                                   
    点:  1指针数组和多重指针                                                 
            2返回指针的函数                                                   
                                                                         
                                                                       
    点:  1用函数指针变量调用函数                                                 
            2指针数组做main函数的形参                                                     
                                                                       
                                                                       
                                                                                                                                   
教学方法:  多媒体教学+上机                                                         
                                                                           
                                                                           
课外作业:                                                             
                                                                           
                                                                         
课后分析                                                             
                                                                           
                                                                         
         
检查者签字:                             

8 善于利用指针
8.1 指针是什么
    如果在程序中定义了一个变量,在对程序进行编译时,系统就会给该变量分配内存单元
    编译系统根据程序中定义的变量类型,分配一定长度的空间
    内存区的每一个字节有一个编号,这就是“地址”,它相当于旅馆中的房间号。
    在地址所标识的内存单元中存放数据,这相当于旅馆房间中居住的旅客一样。
    由于通过地址能到所需的变量单元,我们可以说,地址指向该变量单元。
    将地址形象化地称为“指针”
    务必弄清楚存储单元的地址和存储单元的内容这两个概念的区别
    一个变量的地址称为该变量的“指针”
例如,地址2000是变量i的指针
    如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”
    i_pointer就是一个指针变量。指针变量就是地址变量,用来存放地址的变量,指針变量的值是地址(即指针)
    “指针”和“指针变量”是不同的概念
    可以说变量i的指针是2000,而不能说i的指针变量是2000
    指针是一个地址,而指针变量是存放地址的变量
8.2 指针变量
8.2.1 怎样定义指针变量
    定义指针变量的一般形式为:
      类型  * 指针变量名;
如:int *pointer_1, *pointer_2;
    int是为指针变量指定的“基类型”
    基类型指定指针变量可指向的变量类型
    pointer_1可以指向整型变量,但不能指向浮点型变量
    在引用指针变量时,可能有三种情况:
    给指针变量赋值。如:p=&a;
    引用指针变量指向的变量。如有
              p=&a;  *p=1;
              则执行printf(%d,*p);  将输出1
    引用指针变量的值。如:printf(%o,p);
8.2.2 怎样引用指针变量
    要熟练掌握两个有关的运算符:
(1)   取地址运算符。
          &a是变量a的地址
(2) *  指针运算符(“间接访问”运算符)
  如果: p指向变量a,则*p就代表a
  k=*p;      (a的值赋给k)
  *p=1;      (1赋给a)
8.2.3 指针变量作为函数参数
    如果想通过函数调用得到n个要改变的值:
在主调函数中设n个变量,用n个指针变量指向它们
设计一个函数,有n个指针形参。在这个函数中改变这n个形参的值
在主调函数中调用这个函数,在调用时将这n个指针变量作实参,将它们的地址传给该函数的形参
在执行该函数的过程中,通过形参指针变量,改变它们所指向的n个变量的值
⑤主调函数中就可以使用这些改变了值的变量
8.3通过指针引用数组
8.3.1 数组元素的指针
    一个变量有地址,一个数组包含若干元素,每个数组元素都有相应的地址
    指针变量可以指向数组元素(把某一元素的地址放到一个指针变量中)
    所谓数组元素的指针就是数组元素的地址
    可以用一个指针变量指向一个数组元素
  Int a[10]={1,3,5,7,9,11,13,15,17,19};
  int  *p;
  p=&a[0];
8.3.2 在引用数组元素时指针的运算
    在指针指向数组元素时,允许以下运算:
    加一个整数(++=),如p+1
    减一个整数(--=),如p-1
    自加运算,如p++++p
    自减运算,如p----p
    两个指针相减,如p1-p2 (只有p1p2都指向同一数组中的元素时才有意义)
(1) 如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素,p-1指向同一数组中的上一个元素。
    float a[10],*p=a;
    假设a[0]的地址为2000,则
    p的值为2000
    p+1的值为2004
    P-1的值为1996
(2) 如果p的初值为&a[0],则p+ia+i就是数组元素a[i]的地址,或者说,它们指向a数组序号为i的元素
(3)  *(p+i)*(a+i)p+ia+i所指向的数组元素,即a[i]
(4) 如果指针p1p2都指向同一数组
  p2-p1的值是4
  不能p1+p2
8.3.3 通过指针引用数组元素
    引用一个数组元素,可用下面两种方法: (1) 下标法,如a[i]形式
  (2) 指针法,如*(a+i)*(p+i)
  其中a是数组名,p是指向数组元素的指针变量,其初值p=a
    3种方法的比较:
(1)和第(2)种方法执行效率相同
    C编译系统是将a[i]转换为*(a+i)处理的,即先计算元素地址。
    因此用第(1)和第(2)种方法数组元素费时较多。
(3)种方法比第(1)、第(2)种方法快
    用指针变量直接指向元素,不必每次都重新计算地址,像p++这样的自加操作是比较快的
    这种有规律地改变地址值(p++)能大大提高执行效率
用下标法比较直观,能直接知道是第几个元素。
    用地址法或指针变量的方法不直观,难以很快地判断出当前处理的是哪一个元素。
8.3.4 用数组名作函数参数
    用数组名作函数参数时,因为实参数组名代表该数组首元素的地址,形参应该是一个指针变量
    C编译都是将形参数组名作为指针变量来处理的
8.3.5 通过指针引用多维数组
    指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念上和使用方法上,多维数组的指针比一维数组的指针要复杂一些。
8.4 通过指针引用字符串
8.4.1 字符串的引用方式
    字符串是存放在字符数组中的。引用一个字符串,可以用以下两种方法。
(1) 用字符数组存放一个字符串,可以通过数组名和格式声明“%s”输出该字符串,也可以通过数组名和下标引用字符串中一个字符。
(2) 用字符指针变量指向一个字符串常量,通过字符指针变量引用字符串常量。
8.4.2 字符指针作函数参数
    如果想把一个字符串从一个函数“传递”到另一个函数,可以用地址传递的办法,即用字符数组名作参数,也可以用字符指针变量作参数。
    在被调用的函数中可以改变字符串的内容
    在主调函数中可以引用改变后的字符串。
8.4.3 使用字符指针变量和字符数组的比较
    用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有 区别的,不应混为一谈,主要有以下几点。
(1) 字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第1个字符的地址),决不是将字符串放到字符指针变量中。
(2) 赋值方式。可以对字符指针变量赋值,但不能对数组名赋值。
char *a; a=I love China!
char str[14];str[0]=I
char str[14]; str=I love China!;
3)初始化的含义
char *a=I love China!”;
char *a; a=I love China!”;等价
(4) 存储单元的内容
编译时为字符数组分配若干存储单元,以存放各元素的值,而对字符指针变量,只分配一个存储单元
(5) 指针变量的值是可以改变的,而数组名代表一个固定的值(数组首元素的地址),不能改变。
(6) 字符数组中各元素的值是可以改变的,但字符指针变量指向的字符串常量中的内容是不可以被取代的。
char a[]=House,*b= House;
a[2]=r;       
(7) 引用数组元数
  对字符数组可以用下标法和地址法引用数组元素(a[5],*(a+5))。如果字符指针变量p=a,则也可以用指针变量带下标的形式和地址法引用(p[5],*(p+5))。
(8) 用指针变量指向一个格式字符串,可以用它代替printf函数中的格式字符串。
8.5 指向函数的指针
8.5.1什么是函数指针
如果在程序中定义了一个函数,在编译时,编译系统为函数代码分配一段存储空间,这段存储空间的起始地址,称为这个函数的指针。
    可以定义一个指向函数的指针变量,用来存放某一函数的起始地址,这就意味着此指针变量指向该函数。例如:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。