我正在阅读The C Book以尝试在C中获得更好的基础。虽然我认为我通常会得到指针的概念,但有一件事对我而言似乎是在概括它无论它是什么指向一个全局变量(例如,使用指针从void
函数返回值的能力),我自然会随之承担所有伴随的危险。
除了指针引用数组中的特定变量或索引这一事实外,是指针和全局变量之间的区别吗?
答案 0 :(得分:18)
他们是完全不同的野兽。为了更好地解释,让我定义两者。
<强>指针:强>
变量包含一些数据。指针是一种引用另一块内存的数据。把它想象成“在那里----&gt;”的标志指着某种对象。例如,C中的字符串只是指向字符的指针,按照惯例,您知道在\0
字符之前有更多字符跟随它。 C广泛使用指针,因为除了......之外,没有其他机制可以在程序的各个部分之间共享公共信息。
全局变量:
在程序中,每个函数都有变量。这些可以是函数的参数,也可以是内部定义的参数。同样,您拥有所谓的全局变量。这些变量存储文件中所有函数都可以访问的信息。这可以用于传递诸如全局状态或配置之类的东西。例如,您可能在打印某些消息之前有一个名为debug
的代码检查,或者存储一个全局状态对象,例如视频游戏中的分数。
我认为让您感到困惑的是:两者都可用于在代码的各个部分之间共享信息。因为函数参数在C中通过值传递,所以函数不能修改调用它的变量。有两种方法可以“修复”这个问题。第一种(也是正确的)方法是将指向变量的指针传递给函数。这样,函数知道修改父变量的位置。 另一种方法是使用全局变量。这样,它们不是传递指针,而是直接编辑全局变量。
所以你可以用它们来完成同样的事情,但是它们的工作原理是分开的。实际上,全局变量可以是指针。
答案 1 :(得分:8)
全局变量是可在任何范围内访问的任何变量。指针是一个变量,它包含某些东西所在的地址。
它们之间没有任何直接关系。
指针变量可以在全局或本地范围内,也可以指向全局,本地或无范围内的变量(就好像它从堆中移出或寻址一些DIO行)。
答案 2 :(得分:5)
有很大的不同。除了指针的“其他”用法(包括处理字符串和数组,以及构建动态数据结构,如树和链表),使用指针给另一个函数访问局部变量比共享更加灵活和可控这两个函数之间的全局变量。
首先,它允许被叫函数在不同时间访问不同的变量。如果它总是将结果保存到相同的全局变量中,那么使用scanf()
会更加费力。
其次,将指针传递给另一个函数会让您更加意识到该函数能够修改该对象的事实。如果为同一目的使用全局变量,很容易忘记哪些函数修改了全局变量而哪些函数没有。
第三,全局变量在程序的生命周期中消耗内存。局部变量在其包含函数结束时释放,动态分配的数据在free
d时释放。因此,全局变量有时可能会浪费大量内存。
使用指针会导致引用不再存在的变量的危险,因此必须小心谨慎。但是,当存在复杂的全球或长期数据结构时,这通常是一个问题,而这些数据结构本身往往是设计上的弱点。
Globals阻碍了良好的模块化程序设计,而且指针通常提供了更好的方法来实现相同的目标。
答案 3 :(得分:3)
“指针”是一个变量,它告诉您如何获取值:它是您关心的值的地址。你取消引用它(用*)来获得值。
“Global”定义变量的范围:程序中的任何地方都可以说出名称并获取值。
您可以拥有本地指针或全局非指针。概念是完全正交的。
答案 4 :(得分:0)
完全不同的概念。您可以指向全局变量和局部变量。没有任何关联这两者。
此外,从函数中,您当然可以返回指向该函数范围内的变量的指针。但这是一个坏主意,因为变量存在于函数的堆栈上,现在已经消失了。
答案 5 :(得分:0)
术语指针指的是变量的类型;它是一个用来指代另一个的变量。术语 global 指的是变量范围 - 即它对程序任何部分的可见性。因此,这个问题有点荒谬,因为它们指的是不同种类的变量属性;指针变量实际上可能具有全局范围,因此同时具有这两个属性。
虽然指针可能确实引用了一个不直接在范围内的对象(我认为你指的是这个),但它仍然允许对范围的限制控制,因为指针本身具有范围(当然除非它是全局指针!)。
此外,全局变量始终具有静态存储类。虽然指针可以引用静态,动态或自动变量,并且因为它是变量,指针本身可以是静态的,或者是auto,或者在动态分配的指针数组的情况下 - 也是动态的。
我想也许您正在考虑只使用指针的非常具体的用法,实际上它们具有更大的实用性并且可以在许多方面使用。例如,您几乎总是使用指针来实现链表数据结构中的链接;全局变量不会帮助你做到这一点。
克利福