前段时间闲来看了下《c专家编程》这本书,总天来说写得不错,就是省略了些东西,当时没搞明白--数组和指针的纠结关系,最近写了几句代码测试了下,顿时豁然开朗...
我写了段测试代码:
下面是对应的汇编代码:
下面是这段代码的输出:
***str's addr:bfe38200
***str's neirong:bfe3821f
***str[0]'s addr:bfe3821f
***str[0]'s neirong:61
***ptr's addr:bfe381f4
***ptr's neirong:bfe3821f
//这里就是作为函数形参传递的时候,str和&str[0]以及ptr的值都是以//一样的,这里str已经退化成了指针,就需要按照指针的解析来对数组名//进行解析,而str本身的地址&str则是和&ptr一样,具有自己的地址的,//因此在这里,str和ptr是一样的,已经变成了一个指针.也就是说在编//译器中的符号表中,有与str对应的地址,就是str变量本身的地址,到//这个地址里面取的内容,则就是数组的起始地址的内容.
其实这里得出的结论只有一句话:在数组名做为函数参数和用于表达式中的时候,数组名就退化成了指针,这个退化是完全意义上的,即数组名实际上就是成了一个指针变量,可以完全用解析指针的方法来解析数组名.