天天看点

为什么使用指针

在实际编程中,既然使用变量就可以访问数据,为什么还用指针呢?使用指针来操纵自动变量的唯一原因是,为了说明指针的工作原理。指针真正的用途是被用于完成下列3种任务:

管理自由存储区中的数据

访问类的成员数据和函数

按引用传递参数

    在“函数的 工作原理 ”中,提到了5个内存区域:

全局名称空间

自由存储区

寄存器

代码空间

堆栈

     局部变量和函数参数位于堆栈中:当然,代码位于代码空间中;而全局变量位于全局名称空间中;寄存器用于内部管理工作,如记录栈顶指针和指令指针。余下的所有内存都被作为自由存储区,通常被称为堆。

     局部变量不是永久性的,函数返回时,局部变量就被删除。这很好,因为这意味着根本不用为管理这种内存空间而劳神;也不好,因为这使得函数在不将堆中的对象复制到调用函数中的目标对象的情况下,将难以创建供其他对象或函数使用的对象。全局变量解决了这种问题,其代价是整个程序中都可以访问它们。这导致创建了难以理解和维护的代码。如果管理得当,将数据存储在自由存储区可以解决这两种问题。

可以将自由存储区视为一块很大的内存,其中有数以千计的依次被编号的内存单元,可用于存储数据。与堆栈不同,你不能对这些单元进行标记,而必须先申请内存单元的地址,然后将它存储到指针中。

     可以使用这样的类比:朋友给了你交通银行的800客服电话号码。你回到家中,将该电话号码与某个按钮绑定,然后扔掉记录电话号码的纸张。如果按下按钮,被拨打的电话将响铃,交通银行的职员进行接听。你不需要记下这个电话号码,,也不知道被拨打的电话在哪里,但只要按下绑定的按钮就能致电交通银行。自由存储区中的数据就像交通银行一样,你不知道它在什么地方,但知道如何找到它。你使用地址(在这个例子中,地址为电话号码)访问它。你不必知道地址,只需将其放在一个指针(按钮)中。指针让你能够访问数据,而不必知道细节。

     函数返回时,堆栈被自动清空。所有局部变量都不在作用域内,他们被从堆栈中删除。程序结束前,自由存储器不会自动清空,程序员使用完自己分配的内存后,必须负责将其释放。

自由存储区的优点是,你从中分配的内存将一直可用,知道你明确的指出不再需要——将其释放为止。如果在函数中分配自由存储区中的内存,在函数返回后该内存仍可用。

这也是自由存储区的缺点,如果你忘记释放内存,被占据而没有使用的内存将随着时间的推移愈来愈多,导致系统崩溃。

     采用这种内存访问方式而不是全局变量的优点是,只有能够访问指针的函数才能访问它指向的数据。这样只有将包含指针的对象或指针本身传递给函数,函数才能修改指针指向的数据,从而减少了函数能够改变数据,而又无法跟踪变更的情况发生。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/isnil/archive/2009/05/28/4221636.aspx

继续阅读