BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #90917同步于 2016/4/8
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

【求大神指教】求问关于C语言里面“函数名就是一个指针”这句话

captainprice
2016/4/8镜像同步9 回复
RT-- 数组名是指针这个我理解,有个小疑问在于,假定系统为指针变量分配8字节,如果对于数组名字num取sizeof(num)的话,得到的是数组的长度,取sizeof(&num)很自然是8;但是对于一个函数名num,如果取sizeof(&num)很显然是8,但是为什么sizeof(num)却是1?求大神指教!!!
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
gdl机器人#1 · 2016/4/8
你什么编译环境啊,我这编译都过不了。。。
captainprice机器人#2 · 2016/4/8
你是哪个地方编译不过呢? 【 在 gdl 的大作中提到: 】 : 你什么编译环境啊,我这编译都过不了。。。
gdl机器人#3 · 2016/4/8
sizeof(函数名) 【 在 captainprice 的大作中提到: 】 : 你是哪个地方编译不过呢?
captainprice机器人#4 · 2016/4/8
呃。。。我是在DEV C++ 上试的。。。你是不是在VS上跑的?我刚在VS上试报错sizeof的操作数不能是函数。。。 【 在 gdl 的大作中提到: 】 : sizeof(函数名)
nuanyangyang机器人#5 · 2016/4/8
对于数组和函数的标识符来说,除了用在sizeof(),alignof(),offsetof()里面以外,其他的地方会发生隐式转换。其中, 数组A x[sz]会被隐式转换为指向它的第0个元素的指针。所以,x的类型会变成A* 函数T f(T1 a1, T2, a2, ...)会被隐式转换成指向这个函数的指针。所以f的类型会变为T(*)(T1,T2,...) 但数组的标识符用于sizeof,alignof,offsetof里面的时候,它仍然表示数组。 函数的标识符不能用于上述运算符。 所以,“数组名就是指针”这个说法并不准确。 另外,如果一个函数的参数是数组型的,比如void g(T a[]),那么它等价于void g(T *a)。
gdl机器人#6 · 2016/4/8
算了吧dev C。。。dev c一直觉得很怪。。。 单就函数名是指针这个问题,我个人觉得其实它是把汇编码拿到高级语言来说明的,汇编语言中调用一个函数用的是指令call,例如call xxxxxxxx,xxxxxxxx就是函数的起始地址。。。长度就是一个指针的大小。 【 在 captainprice 的大作中提到: 】 : 呃。。。我是在DEV C++ 上试的。。。你是不是在VS上跑的?我刚在VS上试报错sizeof的操作数不能是函数。。。
captainprice机器人#7 · 2016/4/8
谢谢暖神!! 【 在 nuanyangyang 的大作中提到: 】 : 对于数组和函数的标识符来说,除了用在sizeof(),alignof(),offsetof()里面以外,其他的地方会发生隐式转换。其中, : 数组A x[sz]会被隐式转换为指向它的第0个元素的指针。所以,x的类型会变成A* : 函数T f(T1 a1, T2, a2, ...)会被隐式转换成指向这个函数的指针。所以f的类型会变为T(*)(T1,T2,...) : ...................
captainprice机器人#8 · 2016/4/8
谢谢大神 【 在 gdl 的大作中提到: 】 : 算了吧dev C。。。dev c一直觉得很怪。。。 : 单就函数名是指针这个问题,我个人觉得其实它是把汇编码拿到高级语言来说明的,汇编语言中调用一个函数用的是指令call,例如call xxxxxxxx,xxxxxxxx就是函数的起始地址。。。长度就是一个指针的大小。
a206206机器人#9 · 2016/4/17
都是编译时候确定的,地址的话就是指针了,实际上就是一个地址。对于函数名做这个计算确实没有意义