指针(一)

        指针是C语言中的一个难点,但是只要自己有一套对指针的学习方法或是对指针的理解,那么一切变得简单了,今天先总结指针中简单的变量、一级指针、二级指针之间的关系

一、关于指针的定义及其注意

1.      地址的定义:

在计算机硬件系统的内部存储器中,拥有大量的存储单元(容量为1字节)。为了方便管理,必须为每一个存储单元编号,这个编号就是存储单元的“地址”。每个存储单元都有一个唯一的地址。

 

2.      内存单元的地址与内存单元中的数据是两个完全不同的概念。

内存单元的地址——系统分配给变量的内存单元的起始地址

内存单元中的数据——在地址所标识的存储单元中存放的数据。

 

3.指针的定义

                  内存单元的编号也叫做地址,既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地址称为指针

小结:地址就是指针,指针就是地址。

特别注意:内存单元的指针内存单元的内容是两个不同的概念。

        总结:

                  对于一个内存单元来说,单元的地址即为指针,其中存放的数据才是该单元的内容。

 

4.指针变量概念

        C语言中,允许用一个变量来存放指针(地址),这种变量称为指针变量。因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。

        注意!

                  严格意义上说,指针是一个地址,是一个常量

                  指针变量是存放一个地址,是一个变量

 

5.定义指针变量的一般形式

        类型说明符 *变量名

其中:

        *表示这是一个指针变量

        变量名即为定义的指针变量名

        类型说明符表示指针变量所指向的变量的数据类型

        例如:

                  int*p       表示定义了一个指针变量,变量名是p

                                    int表示,p只能存放一个int类型的变量的地址

                  char*p1 表示定义了一个指针变量,变量名是p1

                                    p1只能存放一个char类型的变量的地址

注意!

1>    在定义指针时,“*”号表示定义的变量时指针变量,变量的值只能存放地址。

如果没有“*”就相当于定义一个普通变量

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

 

6.使用“*”获取指针对应存储区域的内容

        指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机。指针变量的赋值只能赋予地址,绝不能赋予任何其它数据,否则将引起错误。

 

7&*的说明

        &:取地址运算符

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

        使用时的一般格式:

        &变量名

如:

&a表示变量a的地址

        &b表示变量b的地址

注意:变量本身必须预先说明

 

        *指针变量名

                  关于*的使用注意:

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

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

如:

          int *p;

          *p=123;

 

                  小结:“*”的用法:

                           用于定义指针变量

                           存储指针变量指向的存储空间的内容

 

8.二级指针介绍

        

        如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。也称为“二级指针”

 

        通过指针访问变量称为间接访问。由于指针变量直接指向变量,所以称为“一级指针”。

而如果通过指向指针的指针变量来访问变量则构成“二级指针”。

 

9.指针为什么要区分类型

        在同一种编译器环境下,一个指针变量所用的内存空间是固定的。比如,在16为编译器环境下,任何一个指针变量都只占用2个字节,并不会随所指向变量的类型而改变。

虽然所有的指针都只占8个字节,但不同类型的变量却占不同的字节数。如果定义指针变量不定义类型,那么它在取*也就是取其中的值得时候,就不知道应该读取几个字节,而定义了类型之后:如果是int类型就读取4个字节,char型就读一个字节。



                                 二、指针实例操作

下面我们用实例来说明“变量、一级指针、二级指针之间的关系”。

我们先定义一个int类型的变量 a,然后再定义一个一级指针变量p,一个二级指针变量p1。我们在前面的介绍中说过所用变量都有地址,所以我们定义指针变量p指向a,指针p1指向p。接下来我们通过打印a、p、p1的地址来看看它们之间有什么关系。

打印如下:


通过程序的运行及打印的内容让我们的猜想得到了验证,接下来我们总结一下变量、一级指针、二级指针之间的关系。

假设这是一个内存分配空间,因为我们定义了变量a,一级指针变量p,二级指针变量p1。由于程序中有一下语句使得它们之间有了关系。

int *p=&a; 表明定义了一个指针变量p并且把变量a的地址存储到了指针变量p中

int **p1=&p; 表明定义了一个二级指针变量p1并且把指针变量p的地址存储到了二级指针变量p1中

通过上面的分析,我们可以说p指向了a,p1指向了p,也就是

p等于变量a的地址:p=0x000010

p1等于指针变量p的地址:p1=0x000020

在第一部分我们已经说明了*号的用法,只有在定义指针变量的时候*是表示在定义一个指针变量,如果没有*就是在定义一个普通变量。

其他位置出现的*都是表示取存储空间的值。如:*p 表示取p中存储的内容(值)。

就拿本例来说明:

 由上图可以知道指针变量p指向变量a或可以说成为指针变量p存储着变量a的地址,因为*号只是表示*号后面的变量名是一个指针变量,所以

p=0x000010

那么*p表示什么?因为在上面说过,*在非定义指针变量时出现是表示取地址中的内容(值)。所以

*p=*(0x000010)=4


就按照这样的思路来分析一下二级指针p1

同理p1中存储的是p的地址,所以


   p1=0x000020

那么*p1是什么意思?按我们分析思路*表示取p1中的内容,因为p1=0x000020也就是取0x000020中的内容(值)。所以

*p1=*(0x000020)=0x000010

所以*p1=0x000010

那么**p1是什么意思?继续按我们思路来分析**p1可以表示为*(*p1)又因为*p1=0x000010所以可以变成

*(0x000010),这又表示取地址0x000010中存储的内容。所以

**p1=*(*p1)=*(0x000010)=4

总结:

    以上分析了变量、一级指针变量、二级指针变量之间的关系,只要按照这样的思路来学习、分析指针就不会乱,总结这些思路和分析方法是为了更好的学习接下来的数组与指针、指针数组、字符串指针等等。







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值