Cpp Experiment -- sizeof and array

    这是很多公司面试的时候会问的问题——当然,在你加入某家公司后,你可能会发现这些东西一点也用不上。因为进去后一般是天天写业务逻辑。

    不过最近写一个功能时涉及到这个东西,就做了个测试,把结果记下来,下面是代码:

#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——————————————————————————

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值