我正在阅读C书,试图在C语言中找到一个更好的基础.虽然我认为我通常会得到指针的概念,但有一件事对我来说似乎是它正在推广它指向一个全局的东西.变量(例如,使用指针从void
函数返回值的能力),我自然会随之携带所有伴随的危险.
除了指针引用数组中的特定变量或索引这一事实外,指针和全局变量之间的区别是什么?
他们是完全不同的野兽.为了更好地解释,让我来定义两者.
指针:
变量包含一些数据.指针是一种引用另一块内存的数据.可以把它想象成一个标志,上面写着"那边----"指着某种对象.例如,C中的字符串只是指向字符的指针,按照惯例,您知道在字符之后有更多字符跟随它\0
.C广泛使用指针,因为除了....之外,没有其他机制可以在程序的各个部分之间共享公共信息.
全局变量:
在程序中,每个函数都有变量.这些可以是函数的参数,也可以是内部定义的参数.同样,您拥有所谓的全局变量.这些变量存储文件中所有函数都可以访问的信息.这可以用于传递诸如全局状态或配置之类的东西.例如,您可能debug
在打印某些消息之前调用了一个代码进行检查,或者存储了一个全局状态对象,例如视频游戏中的分数.
我认为让您感到困惑:两者都可用于在代码的各个部分之间共享信息.因为函数参数是通过C中的值传递的,所以函数不能修改调用它的变量.有两种方法可以"修复"这个问题.第一种(也是正确的)方法是将指向变量的指针传递给函数.这样,函数知道修改父变量的位置.另一种方法是使用全局变量.这样,他们只是直接编辑全局变量,而不是传递指针.
所以你可以使用它们来完成同样的事情,但是它们的工作方式非常分散.实际上,全局变量可以是指针.
全局变量是可在任何范围内访问的任何变量.指针是一个变量,它包含某些东西所在的地址.
它们之间没有任何直接关系.
指针变量可以在全局或本地范围内,也可以指向全局,本地或无范围内的变量(就好像它是从堆中移出或寻址一些DIO行).
这是一个巨大的差异.除了指针的"其他"用法(包括处理字符串和数组,以及构建动态数据结构,如树和链表),使用指针给另一个函数访问局部变量比共享更加灵活和可控这两个函数之间的全局变量.
首先,它允许被调用函数在不同时间提供对不同变量的访问.scanf()
如果它总是将结果保存到相同的全局变量中,那么使用它会更加费力.
其次,将指针传递给另一个函数会让您更加意识到该函数将能够修改该对象.如果为同一目的使用全局变量,则很容易忘记哪些函数修改全局变量而哪些函数不修改全局变量.
第三,全局变量在程序的生命周期中消耗内存.局部变量在其包含函数结束时释放,动态分配的数据在free
d 时释放.因此,全局变量有时可能会浪费大量内存.
使用指针会导致引用不再存在的变量的危险,因此必须小心谨慎.但是,当存在复杂的全球或长期数据结构时,这通常是一个问题,而这些数据结构本身通常是设计上的弱点.
Globals只是妨碍了良好的模块化程序设计,而指针往往提供了一种更好的方法来实现相同的功能.