那句经典名句怎么说来着: 调试器下无秘密。
如果你用调试器查看一下 反汇编 指令,真相就会大白。
来把你的printSize函数再写一个版本,一个是你原来写的,一个是直接用指针作为参数:
void
printSize
(
int
a
[
10
])
{
printf
(
"%d
\n
"
,
sizeof
(
a
));
}
void
printSize2
(
int
*
a
)
{
printf
(
"%d
\n
"
,
sizeof
(
a
));
}
int
main
()
{
int
size
=
sizeof
(
a
);
printSize
(
a
);
printSize2
(
a
);
return
0
;
}
我们来看一下,调用这两个函数的反汇编指令有什么不同?
看到了吧?一毛一样!
再来看下main函数中这行代码的反汇编是什么样的:
int
size
=
sizeof
(
a
);
看到了吗,直接就赋值了,没有什么计算的过程。
结论:
1、sizeof是编译时就确定的,而不是等到运行时,具体是指针还是数组,编译器在编译当前函数时,自然可以根据定义来分辨。
2、但通过函数传参以后,数组一律都是变成了地址传递,长度信息就丢失了,和指针就是一样的,此时编译器无法再进行分辨。
所以就会出现你看到的那个现象。
如果觉得不错,帮忙给 @轩辕之风 点个赞哦~