C中的指针和全局变量有什么区别?

我正在阅读The C Book ,试图在C语言中找到一个更好的基础。虽然我认为我通常会得到指针的概念,但有一点让我觉得它似乎正在推广它指向全局的任何东西。变量(例如,使用指针从void函数返回值的能力),我认为这自然带有所有伴随的危险。

除了指针引用数组中的特定变量或索引之外,指针和全局变量之间的区别什么?

他们是完全不同的野兽。 为了更好地解释,让我定义两者。

指针:

变量包含一些数据。 指针是一种引用另一块内存的数据。 可以把它想象成一个标志,上面写着“那边—-”指着某种对象。 例如,C中的字符串只是指向字符的指针,按照惯例,您知道跟随字符的字符数要多,直到\0字符。 C广泛使用指针,因为除了….之外,没有其他机制可以在程序的各个部分之间共享公共信息。

全局变量:

在程序中,每个函数都有变量。 这些可以是函数的参数,也可以是内部定义的参数。 同样,您拥有所谓的全局变量。 这些变量存储文件中所有函数都可以访问的信息。 这对于传递全局状态或配置等内容非常有用。 例如,您可能在打印某些消息之前有一个名为debug ,或者存储一个全局状态对象,如video游戏中的分数。

我认为让您感到困惑:两者都可用于在代码的各个部分之间共享信息。 因为函数参数是通过C中的值传递 ,所以函数不能修改调用它的变量。 有两种方法可以“解决”这个问题。 第一种(也是正确的)方法是将指向变量的指针传递给函数。 这样,函数知道修改父变量的位置。 另一种方法是使用全局变量。 这样,他们只是直接编辑全局变量,而不是传递指针。

所以你可以使用它们来完成同样的事情,但它们的工作方式是完全分开的。 实际上,全局变量可以是指针。

全局变量是可在任何范围内访问的任何变量。 指针是一个变量,它包含某些东西所在的地址。

它们之间没有任何直接关系。

指针变量可以在全局或本地范围内,也可以指向全局,本地或无范围的变量(就好像它是从堆中移出或寻址一些DIO行)。

这是一个巨大的差异。 除了指针的“其他”用法(包括处理字符串和数组,以及构建动态数据结构,如树和链表),使用指针给另一个函数访问局部变量比共享更加灵活和可控这两个函数之间的全局变量。

首先,它允许被调用函数在不同时间提供对不同变量的访问。 想想如果它总是将结果保存到相同的全局变量中,那么使用scanf()将会更加费力。

其次,将指针传递给另一个函数会让您更加意识到该函数能够修改该对象的事实。 如果为同一目的使用全局变量,则很容易忘记哪些函数修改了全局变量而哪些函数没有。

第三,全局变量在程序的生命周期中消耗内存。 局部变量在其包含函数结束时释放,动态分配的数据在free时释放。 因此,全局变量有时可能会浪费大量内存。

使用指针会导致引用不再存在的变量的危险,因此必须小心谨慎。 但是,当存在复杂的全球或长期数据结构时,这通常是一个问题,而这些数据结构本身往往是设计上的弱点。

Globals阻碍了良好的模块化程序设计,指针通常提供了更好的方法来实现相同的function。

“指针”是一个变量,告诉您如何获取值:它是您关心的值的地址。 你取消引用它(用*)来获得值。

“Global”定义变量的范围:程序中的任何地方都可以说出名称并获取值。

您可以拥有本地指针或全局非指针。 这些概念完全正交。

完全不同的概念。 您可以指向全局和局部变量。 没有任何关联这两者。

此外,从函数中,您当然可以返回指向该函数范围内的变量的指针。 但这是一个坏主意,因为变量存在于函数的堆栈中,现在已经消失了。

术语指针指的是变量的类型; 它是一个用来指代另一个的变量。 全局一词指的是变量范围 – 即它对程序任何部分的可见性。 因此,这个问题有点荒谬,因为它们涉及不同种类的变量属性; 指针变量实际上可能具有全局范围,因此同时具有这两个属性。

虽然指针可能确实引用了一个不直接在范围内的对象(我认为你指的是这个),但它仍然允许对范围进行受限制的控制,因为指针本身具有范围(当然除非它是全局指针) !)。

此外,全局变量始终具有静态存储类。 虽然指针可以指静态,动态或自动变量,并且因为它是变量,指针本身可以是静态的,或者是自动的,或者在动态分配的指针数组的情况下 – 也是动态的。

我想也许您正在考虑只使用指针的非常具体的用途,实际上它们具有更大的实用性并且可以在许多方面使用。 例如,您几乎总是使用指针来实现链表数据结构中的链接; 全局变量不会帮助你做到这一点。

克利福德