当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《C中的指针和全局变量有什么区别?》经验,为你挑选了3个好方法。

我正在阅读C书,试图在C语言中找到一个更好的基础.虽然我认为我通常会得到指针的概念,但有一件事对我来说似乎是它正在推广它指向一个全局的东西.变量(例如,使用指针从void函数返回值的能力),我自然会随之携带所有伴随的危险.

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



1> McPherrinM..:

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

指针:

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

全局变量:

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

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

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


如果信息不需要是全局的,那么您只是污染全局命名空间.理解您的代码会变得更加困难,因为全局状态的变化可能来自任何地方.在多线程程序中,如果使用全局变量或静态变量而没有非常小心和/或锁定,则编辑状态的函数将不会是重入或递归的.
为什么(或在什么情况下)传递指针比使用全局变量更"正确"?

2> San Jacinto..:

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

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

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



3> Artelius..:

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

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

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

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

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

Globals只是妨碍了良好的模块化程序设计,而指针往往提供了一种更好的方法来实现相同的功能.

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有