28-指针的定义和初始化

本节知识点:

1、指针变量

2、定义一个指针变量

3、指针变量的引用

4、指针变量的初始化方法

5、使用*获取指针对应存储区域的内容

—————————————————————————————————-

1、指针变量

  在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。

  因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。

注意,严格意义上讲:

  指针是一个地址,是一个常量。

  指针变量是存放一个地址,是一个变量。 指针变量用于存放指针(地址)。

对比整型数据理解:int a = 10;

  10 是一个整型数据, 是一个常量

  整型变量a是存放整型数据的,是一个变量。

图中:变量i_pointer 就是一个指针变量,查看k = i + j; 的存储过程

2、定义一个指针变量

对指针变量的定义包括3个内容:

  (1) 指针类型说明,即定义变量为一个指针变量

  (2) 指针变量名

  (3) 变量值(指针)

一般形式为:类型说明符 *变量名  可以理解为 (类型说明符 *)变量名

  其中,这里的*只具有象征意义,仅表示这是一个指针变量,变量名即为定义的指针变量的名称,类型说明符表示本指针变量所指向的变量的数据类型。

  当类型说明确定后,指针变量就只能指向该类型的数据存储空间。

例如:

  int *pi;       //一个指向整型变量的指针

  long *pl;    //一个指向长整型变量的指针

  float *pf;    //一个指向单精度浮点型变量的指针

  char *pc;   //一个指向字符型变量的指针

注意:

  (1) 在定义指针时,” * “号只能代表一个指针。

  (2) 一个类型的指针只能指向同类型的变量,不能指向其他类型的变量。

  (3) 指针也可以被声明为全局、静态局部和局部的

3、指针变量的引用

  指针变量跟普通变量一样,使用之前不仅要定义声明,而且必须赋予具体的值。

  未经赋值的指针变量不能使用(即野指针),否则将造成系统混乱,甚至死机。

  指针变量的赋值只能赋予地址,决不能赋予任何其它数据,否则将引起错误。

  在C语言中,变量的地址是由编译系统分配的,对用户完全透明,用户不知道变量的具体。

两个有关的运算符:

    & : 取地址运算符

      一般形式为: &变量名;

     如:&a 表示 变量a的地址。(变量本身必须预先声明)

    * : 指针运算符(或称”间接访问”运算符)

      一般形式为:*指针变量名;

     如:*p 表示间接访问指针变量p所指向的存储空间

    & 与 * 是一对反操作符,二者连着使用会互相抵消,相当于什么都没做。

4、指针变量的初始化方法

  指针变量初始化的方法有两种:定义的同时进行初始化和先定义后初始化

  设有指向整型变量的指针变量p,如要把整型变量a的地址赋予p可以有以下两种方式:

(1) 定义的同时进行初始化

  int a = 5;

  int *p = &a;

(2) 先定义后初始化

  int a;

  int *p;

  p = &a;

以下是不合法的初始化:

 1> 指针变量不能被赋值一个整数值(因为我们不知道这个整型常量是内存的哪块地址)

  2> 被赋值的指针变量前不能再加  *   说明符,如写为 *p = &a; 也是错误的

注意点:

  a. 多个指针变量可以指向同一个地址

  b. 指针变量的指向是可以改变的

  c. 指针变量没有初始化,里面是一个垃圾值,这时我们称这是一个野指针

    如何操作一个野指针

      1> 可能会导致程序崩溃

      2> 访问你不该访问的数据

所以指针变量必须先初始化才可以访问其所指向的存储空间。

思考&实现1: 

有一个整数i值是200,在内存中地址为1800,定义指针p指向变量i,请画图说明存储结构。

 

5、使用” * “获取指针所对应存储区域的内容

(1) 在定义变量的时候 * 是一个类型说明符,说明定义的这个变量是指针变量。

(2) 在不是定义变量的时候 * 是一个操作符,访问指针所指向的存储空间

思考&实现2: 定义如下指针变量

    float  *pointer_3;
    char  *pointer_4;
    int  a,b;
    int  *pointer_1,*pointer_2;

判断下列操作是否合法?

*pointer_1=&a;    //*pointer_1是一个值,是常量。

pointer_3=2000;   //因为2000是数值,不能确定是不是地址

pointer_3=&a;     //,pointer_3只能指向float类型的变量地址

pointer_1=&a;     //可以

pointer_2= pointer_4 //也是会有问题的

人生之路,不忘初心,勿忘始终!

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

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