这是很多公司面试的时候会问的问题——当然,在你加入某家公司后,你可能会发现这些东西一点也用不上。因为进去后一般是天天写业务逻辑。
不过最近写一个功能时涉及到这个东西,就做了个测试,把结果记下来,下面是代码:
#include <iostream>
using namespace std;
void getSize(char *a)
{
cout << sizeof(a) << endl;
}
void fakeFunc(char a[20])
{
cout << sizeof(a) << endl;
}
// 形参是数组引用
void getArraySize(char (&a)[10])
{
cout << sizeof(a) << endl;
}
int main()
{
char a[10];
char *b = new char[10];
cout << sizeof(a) << endl;
cout << sizeof(b) << endl;
getSize(a);
getSize(b);
fakeFunc(a);
fakeFunc(b);
getArraySize(a);
//getArraySize(b); 无法通过编译
return 0;
}
首先是直接定义一个char数组和定义一个char *指针指向一个new出来的数组。这两者之间的区别在于:前者,虽然我们编译器总是比它转成指针, 但它还是一个数组,而第二个东西,它就是一个彻头彻尾的指针,无论如何都变不成一个数组,这点我们可以从测试结果中看到。
这里依次测试了直接sizeof它们,以不同的形参数接收它们,并输出接收后它们的size。下面是结果:
前两个是直接sizeof的大小,可以看到直接传一个数组进去,还是很诚实地输出了10,第二个结果是8,原因就是上面讲的原因,b是一个指针,而不是一个数组,而在64位系统中指针占8个字节。
这里面有一个函数——fakeFunc,为什么叫这个名字,因为这个函数的形参写得很像是要定义一个数组,但实际上,编译器把它转换了,它的形参其实与getSize函数的形参一模一样。所以测出来的结果也都是8(指针的大小),因此接下来是4个连着的8。
最后,getArraySize函数,它的形参是一个数组的引用,此时必须传入一个同等size的数组,可以看到,我在main函数中只调用了一次getArraySize,传入的是a,而没有传入b的版本。这是因为传b进去根本就通不过编译。
————————————————————————End——————————————————————————