对C语言中指针初始化的更深一步的认识
说来惭愧,前几天编程序,犯了一个比较低级的错误,结果导致折腾了一上午来解决这个问题,最后发现,问题主要是出在对于指针的初始化认识的不够深刻,遂现在记录之,以便于时刻提醒自己。
指针在C语言编程中的重要性在这里自不必多说,单单有一本非常经典的C语言编程书籍叫《C和指针》便可体现出来。指针看似简单,但是却常常是整个程序走不通的主要原因。所以,认识指针一定不能只是单单的停留在表面的概念和定义上,知道指针变量所存储的值是所指向的地址值,知道间接访问,这些是远远不够的,应该能够透过指针华丽的外衣,裸视指针!
而在指针中,我个人认为最难理解的实际上是指针的定义和初始化,为什么这么说?直接上例子。
就以这两句初始化为例,有多少人看到这样的初始化会直接说,这不就是初始化一个指针*p,这个指针指向的是一个类型为整型的值。不错,这确实是没错,但是更准确的说法应该是,1、其实指针变量指的是p这个变量,指针变量指的就是p,而不是*p;2、而int指出的是这个指针所指向的值的类型;3、而*只是表明这个p变量是一个指针变量。看到一个指针变量的定义,一定不能只是单纯的从普通变量定义的角度来看待,如int p,这是个普通变量的定义,看到这个定义,可以直接将其分成两部分来看,1、定义了一个变量p;2、这个变量p是一个整型变量。但是指针变量的定义,如果只是这样单纯的从两部分来看,就大错特错了。再拿第二个定义为例,乍一看上去,感觉吓一跳,但实际上按照上面说的对于指针的三部分看的方法,就非常明显了,1、首先定义的是一个指针变量pp,这里注意,这里确实是定义了一个指针变量,这个指针变量就是pp,不是*pp,也不是**pp,这里很多人会搞混,;2、**指出,这里定义的是一个指向指针的指针,即这个变量pp指向的是一个指针,再更加深入的解释,就是pp中存储的值是一个指针变量所在的地址,对pp进行间接访问实际上得到的是一个指针所在内存空间中存储的值,而这个指针所占用的内存空间中所存储的值仍然是一个地址值,这里记为addr1;3、int则指出的是addr1这个地址空间中存储的值为int型的。这里如图:
介绍完指针变量的定义之后,接下来说说指针变量的初始化问题,这个问题我想对于初学者来说是非常容易迷糊的问题,即使是非初学者,但是对指针的认识不到位的话,也容易在这上面栽跟头。首先按照惯例,看看例子。
看到这样的初始化,想问一个问题,将0赋给了谁?是*p or p?
如果对上面介绍的指针变量的定义的实质有了深刻的理解之后,其实这个问题很简单,不错,0被赋给了指针变量p,也就是说指针变量p所占用的内存空间中现在存储的值是0,换句话说,指针p现在指向的是地址为0x00000000的内存空间。这个概念一定要搞清楚,不能单纯的以为0是p这个指针所指向的值!
这里面的具体的分析过程参看博文对指针进行初始化中的若干问题的思考与反思