返回信息流RT--
数组名是指针这个我理解,有个小疑问在于,假定系统为指针变量分配8字节,如果对于数组名字num取sizeof(num)的话,得到的是数组的长度,取sizeof(&num)很自然是8;但是对于一个函数名num,如果取sizeof(&num)很显然是8,但是为什么sizeof(num)却是1?求大神指教!!!
这是一条镜像帖。来源:北邮人论坛 / cpp / #90917同步于 2016/4/8
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
【求大神指教】求问关于C语言里面“函数名就是一个指针”这句话
captainprice
2016/4/8镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
呃。。。我是在DEV C++ 上试的。。。你是不是在VS上跑的?我刚在VS上试报错sizeof的操作数不能是函数。。。
【 在 gdl 的大作中提到: 】
: sizeof(函数名)
对于数组和函数的标识符来说,除了用在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)。
算了吧dev C。。。dev c一直觉得很怪。。。
单就函数名是指针这个问题,我个人觉得其实它是把汇编码拿到高级语言来说明的,汇编语言中调用一个函数用的是指令call,例如call xxxxxxxx,xxxxxxxx就是函数的起始地址。。。长度就是一个指针的大小。
【 在 captainprice 的大作中提到: 】
: 呃。。。我是在DEV C++ 上试的。。。你是不是在VS上跑的?我刚在VS上试报错sizeof的操作数不能是函数。。。
谢谢暖神!!
【 在 nuanyangyang 的大作中提到: 】
: 对于数组和函数的标识符来说,除了用在sizeof(),alignof(),offsetof()里面以外,其他的地方会发生隐式转换。其中,
: 数组A x[sz]会被隐式转换为指向它的第0个元素的指针。所以,x的类型会变成A*
: 函数T f(T1 a1, T2, a2, ...)会被隐式转换成指向这个函数的指针。所以f的类型会变为T(*)(T1,T2,...)
: ...................
谢谢大神
【 在 gdl 的大作中提到: 】
: 算了吧dev C。。。dev c一直觉得很怪。。。
: 单就函数名是指针这个问题,我个人觉得其实它是把汇编码拿到高级语言来说明的,汇编语言中调用一个函数用的是指令call,例如call xxxxxxxx,xxxxxxxx就是函数的起始地址。。。长度就是一个指针的大小。