第6章 指针

  1. 引言。
    1. 指针是一种数据类型。所谓指针,就是存放数据的内存单元地址。
    2. 指针变量是一种变量,该变量中存放的数据就是指针类型的数据。
    3. 对于一个变量或数组元素来说,可以通过变量名或数组名[下标]来引用;也可以通过指针变量来引用,但需要将变量或数组的地址放到指针变量中。
  2. 指针和指针变量。
    1. 引言。指针就是地址,地址是一种数据类型。指针变量只能存放地址类型的数据,可以称为“地址型”变量。
    2. 指针。
      1. 内存单元和地址。
        1. 运行一个程序时,程序本身和用到的数据都要保存在计算机的内部存储器中。
        2. 内部存储器是由很多个内存单元(字节)组成的,每个单元都有自己独有的、相互不同的地址,称为内存单元地址。
      2. 变量与地址。
        1. 程序中每个变量都要分配连续的字节。
        2. 当一个变量只占用一个字节时,该字节的地址就是变量的地址;当变量占用连续的多个字节时,第一个字节的地址就是该变量的地址。
        3. 对源程序进行编译时,每遇到一个变量,就给它分配内存单元,同时在“变量与地址对照表”中记录变量的名称、数据类型和地址。
        4. 如果在程序中出现赋值语句“f = s + ch;”,实际的操作过程是:在变量地址对照表中找到变量s,取出s的地址,根据其数据类型,取出指定长度的数据。同样方法取出ch中的数据,相加获得表达式的值,然后找到f的地址,根据其类型,转换为格式符合的数据,存入变量f。
        5. 上述操作中,通过变量名查去变量地址,再从变量对应地址的字节中取得值或将某值存入变量对应的地址的字节中成为直接存取方式。由于地址能起到寻找“操作对象”的作用,就像一个指向“操作对象”的指针,所以常把地址成为“指针”。
      3. 数组与地址。
        1. 一个数组的地址,就是第1个元素的地址。
        2. 数组元素a[i]的地址 = 数组首地址 + i*数组元素的数据类型所占用的字节数。
        3. 对源程序进行编译时,每遇到一个数组,按其数据类型和长度分配内存单元,同时在“数组与地址对照表”中记录数组名、数据类型、数组长度、数组首地址。
    3. 指针变量。
      1. 除直接存储方式外,还可以先把要存取的变量的地址存入一个“特殊变量”,然后通过这个其值为地址的“特殊变量”来存取变量的值,称为间接存取方式。
      2. 上述存放地址的“特殊变量”就是指针变量。
  3. 指针变量的定义和初始化。
    1. 指针变量的定义和初始化。
      1. 【格式】数据类型符 *指针变量名[=初值], ...;
        【功能】定义指向“数据类型”的变量或数组的指针变量,同时给其赋初值。
      2. 定义指针变量时的“数据类型”不是指针变量中存放的数据类型,而是它将要指向的变量或数组的数据类型。
      3. 其中的“初值”通常是“&变量名”、“&数组元素”或“一维数组名”。
    2. 指针变量的一般使用方式。
      1. 给指针变量赋值。
        1. 使用格式为:指针变量 = 地址型表达式
        2. C语言规定,变量地址只能通过运算符通过运算来获得。这个运算符是“&”,称为“取地址”运算符,运算对象是变量或数组元素名,运算结果是对应的地址。
        3. C语言规定,一维数组名可以看成是地址常量,其值是一维数组的首地址。
        4. 虽然地址是一个常数,但是,在C语言中不允许把整数看成“地址常量”。所以这里的“地址型表达式”不能是整数。
      2. 直接使用指针变量名。
        1. 使用格式为:指针变量名
        2. 例如数据输入语句的输入变量列表中可以引用指针变量名。
      3. 通过指针变量来引用它所指向的变量。
        1. 使用格式为:*指针变量名
        2. 在程序中,“*指针变量名”代表它所指向的变量或数组元素,其中的“*”称为指针运算符。
        3. 这种引用方式要求指针变量必须有值。
    3. 取地址运算符与指针运算符。
      1. 取地址运算符的运算对象必须是已经定义过的变量或数组元素,但不可以是数组名。
      2. 指针运算符的运算对象必须是地址,可以是已赋值的指针变量,也可以是变量或数组元素的地址,但不能是整数。运算结果就是地址对应的变量。
      3. 单目运算符的运算优先级是同级别的,结合性均为自右向左。
  4. 指针变量的使用。
    1. 指向变量的指针变量的使用。
      1. 给指针变量赋值。指针变量 = 地址表达式
      2. 引用所指向的变量。*指针变量
    2. 指向一维数组的指针变量的使用。
      1. 引言。
        1. 如果要将指针变量指向一维数组,可以有下列两种方法:
          1. 方法一:在数据定义语句中用赋初值的方式 *指针变量 = 数组名
          2. 方法二:在程序中用赋值方式 指针变量 = 数组名
        2. 如果要将指针变量指向一维数组元素,可以有下列两种方法:
          1. 方法一:在数据定义语句中用赋初值的方式: *指针变量 = &数组名[下标]
          2. 方法二:在程序中用赋值方式 指针变量 = &数组名[下标]
      2. 用指向一维数组的指针变量处理数组元素。
        1. 当指针变量指向一维数组时,引用数组元素的方法如下:
          1. 引用“数组元素[0]” *(指针变量+0) 或 *指针变量 或 *指针变量[0]
          2. 引用“数组元素[i]” *(指针变量+i) 或  *指针变量[i]
        2. 当指针变量指向下标为i的一维数组元素时,引用数组元素的方法如下:
          1. 引用“数组元素[i]” *(指针变量+0) 或  *指针变量[i]
          2. 引用“数组元素[i-k]” *(指针变量-k)
          3. 引用“数组元素[i+k]” *(指针变量+k)
        3. 当指针变量指向一维数组后,对下标为i的数组元素的引用一共有四种方法:
          *(指针变量+i)    *(数组名+i)    指针变量[i]    数组名[i]
          前两种为“指针法”,后两种为“下标法”。
        4. 虽然从书写格式上看,指向一维数组的指针变量和数组名可以互换,但它们是完全不同的概念。指针变量是存放地址型数据的变量,可以按照变量的方式对其进行运算或赋值;而数组名代表数组的首地址,是一个地址常量,只能按常量的方式使用。
      3. 指向一维数组的指针变量的运算。
        1. 指针变量和整数的算数运算。
          1. 对指针变量进行算数运算的结果是地址,具体运算规则如下:
            指针变量+整数   指针变量中的地址+整数*指针变量类型占用字节数”对应的地址
            指针变量-整数   指针变量中的地址-整数*指针变量类型占用字节数”对应的地址
            ++指针变量
            --指针变量
            指针变量++
            指针变量--
          2. 以上式子称为“地址型表达式”或“指针型表达式”。
          3. 要特别注意对指向一维数组的指针进行算数运算时,所加减的整数不是指绝对的地址帧数值,而是该地址变量向后或向前移动的同类型一维数组元素的数目。
          4. 可以对代表地址常量的数组名进行加减整数的运算,但不能存回数组名。
        2. 指针变量和指针变量的减法运算。
          1. 指针变量1-指针变量2    结果为它们所指向的数组元素下标相差的整数。
          2. 要求这两个指针变量必须指向同一个数组,否则不能进行减法运算。
        3. 指针变量的关系运算。
          1. 指针变量1 关系运算符 指针变量2    按指针变量中的地址值比较大小
          2. 两个指针变量进行关系运算的结果也是逻辑值。
          3. 关系运算符还可以用于两个地址常量之间的比较,或一个地址常量和一个地址变量之间的比较。更为一般的是两个地址型表达式之间的比较。
      4. 关于使用“指针变量”处理一维数组元素下标越界的问题。
    3. 指向字符串的指针变量的使用。可以用字符型指针变量来处理字符串。
      1. 如何将指针变量指向字符串常量。
        1. 在数据定义语句中用赋初值方式    *指针变量=字符串常量
        2. 在程序中用赋值方式    指针变量=字符串常量
        3. 这两种方式是将存放字符串常量的连续内存单元的首地址赋予指针变量。
        4. 不允许将字符串常量用赋值方式赋予字符型数组。
      2. 指向字符串常量的指针变量的使用。
        1. 处理整个字符串。
          输出字符串    printf("%s", 指针变量);
          输入新的字符串代替原字符串 scanf("%s", 指针变量);
        2. 处理字符串中的单个字符。
          第i(从0开始)个字符的表示方法  *(指针变量+i)
      3. 指向存放字符串的字符数组的指针变量的使用。
  5. 指针数组
    1. 指针数组的定义。
      1. 如果某个数组的元素是指针类型,这样的数组称为指针数组。
      2. 【格式】数据类型 *指针数组名[长度], ...
        【功能】定义指向“数据类型”数据的指针型数组,有“长度”个数组元素。
    2. 指针数组元素的使用。
      1. 指针数组元素的使用和指针变量的使用完全相同,也可以对其赋予地址值。
        对其赋值    指针数组名[下标]=地址型表达式
        引用所指向的变量或数组元素    *指针数组名[下标]
        参加运算(算术运算)    指针数组名[下标]+整数
        指针数组名[下标]+整数
        ++指针数组名[下标]

                                            --指针数组名[下标]
                                            指针数组名[下标]++
                                            指针数组名[下标]--
        (关系运算)                 指针数组名[下标1]  关系运算符  指针数组名[下标2]
      2. 算术运算和关系运算一般只使用于该指针数组元素指向同一个数组时。
  6. 指针程序设计举例。

发表评论

电子邮件地址不会被公开。 必填项已用*标注