在网上查看了很多关于这方面的资料,关于这方面的说法很多,现在自己总结一下
————个人学习总结
数组名绝对不是指针,数组名指代一种数据结构,这种数据结构就是数组。说人话就是数组名其实就是指的数组本身,而之所以数组名绝大部分时候确实是代表数组首元素地址,其原因是内部发生了隐式转化(为什么会设置这种转化和怎样设置的知识水平有限,故不得而知),比如很多资料都说当数组作为函数参数时,退化为一个指针,这里的退化就是上面提到的隐式转化。而sizeof和&这两种特殊情况让数组名成为了数组本身,其原因就是其背后并没有这种隐式转换,并且数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针,在失去其内涵的同时,它还失去了其常量特性,不能作自增、自减等操作,也不能被修改,如下:
关于函数地址:函数的定义只是一段代码,它描述了函数应该执行的操作。函数需要在程序中被调用时才会分配内存空间。实际上是保存在内存中的代码区(可以理解为程序 = 数据+代码,数据在堆栈中,而代码在代码区[会变成二进制的机器指令]),并将函数的机器指令(即函数的代码)存储到这个区域中。函数名称可以理解为这个代码区域的起始地址。当程序执行到函数调用语句时,会跳转到这个地址,从而执行函数的代码
函数名与地址的关系:函数名并不是函数地址的代表,函数名其实就是代表了函数本身,之所以函数名可以代表函数地址(准确来说时函数入口地址),也是因为会发生隐式转化让函数变成指针,就是说,这个转换在表达式中才会发生。比如在C语言中,一个函数占用一段连续的内存区,我们编写的程序,最终是不存在所谓的函数名的,有的只有内存单元地址如0xffeedd00.我们的程序执行时,程序加载到内存,比方说整个程序所占用的内存范围是0xffee0000 ~ 0xffeedd00
假设程序有一个小函数fun(),那么它的范围可能是0xffee0000~0xffee00ff。
那么函数fun()的入口地址是多少? 0xffee0000。那么函数名fun就是0xffee0000的别称(隐式转化)
用一个指针指向这个函数( 指针 = 函数名)实际就是把0xffee0000这个内存单元的地址给指针p。而函数名就是该函数所占内存区的首地址。(但是不能用函数名像数组名那样直接作为参数传递给另一个函数