【问题标题】:What's the difference between Pointers and Global Variables in C?C中的指针和全局变量有什么区别?
【发布时间】:2009-12-12 03:46:02
【问题描述】:

我正在阅读 The C Book 以尝试在 C 语言中获得更好的基础。虽然我认为我通常会了解指针的概念,但有一点让我印象深刻的是,它似乎在概括它所指向的任何内容到一个全局变量中(例如,使用指针从 void 函数返回值的能力),我认为这自然会带来所有随之而来的危险。

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

【问题讨论】:

  • 我想这是我第一次看到“The C Book”这个短语指的是 K&R 以外的作品。
  • 两者完全不同。
  • 是的,我注意到在我评论之前查看了链接之后。
  • 我现在开始使用 c 和 c++,并且想法完全一样。

标签: c pointers global-variables


【解决方案1】:

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

指针:

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

全局变量:

在程序中,每个函数都有变量。这些可以是函数的参数,也可以是内部定义的参数。此外,您还有所谓的全局变量。这些变量存储文件中所有函数都可以访问的信息。这对于传递诸如全局状态或配置之类的东西很有用。例如,您可能有一个名为 debug 的代码,您的代码会在打印一些消息之前对其进行检查,或者存储一个全局状态对象,例如视频游戏中的分数。

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

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

【讨论】:

  • 为什么(或在什么情况下)传递指针比使用全局变量更“正确”?
  • 如果信息不需要是全局的,你只是在污染全局命名空间。理解您的代码可能会变得更加困难,因为对全局状态的更改可能来自任何地方。在多线程程序中,如果编辑状态的函数使用全局变量或静态变量而不加小心和/或锁定,则它不会是可重入或递归的。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

    第三,全局变量会在程序的整个生命周期内消耗内存。局部变量在其包含函数结束时释放,动态分配的数据在freed 时释放。因此,全局变量有时会造成相当大的内存浪费。

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

    全局变量只会妨碍良好的模块化程序设计,而指针通常会提供更好的方法来实现相同的目标。

    【讨论】:

      【解决方案4】:

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

      “全局”定义了变量的作用域:程序中的任何地方都可以说出名字并获取值。

      你可以有局部指针,也可以有全局非指针。这些概念是完全正交的。

      【讨论】:

        【解决方案5】:

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

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

        此外,全局变量always 具有静态存储类。而指针可能指的是静态、动态或自动变量,因为它是一个变量,所以指针本身可能是静态的或自动的,或者在动态分配的指针数组的情况下 - 也是动态的。

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

        克利福德

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-11-24
            • 2013-07-12
            • 1970-01-01
            • 2018-04-23
            • 1970-01-01
            • 2016-01-17
            • 2011-01-04
            相关资源
            最近更新 更多