在c/c++中我们一般都用 sizeof(数组名)/sizeof(数组元素类型) 来计算数组的长度,其中 sizeof(数组名) 计算的是数组占用的存储大小。同时,一般我们认为数组名和指针就是一回事,最近写程序时将数组名作为指针形参传入函数,想在函数中用 sizeof(指针形参)/sizeof(数组元素类型) 来计算数组长度时却出了错,最后发现原来是sizeof(数组名)和sizeof(指针)的区别导致的,于是写了段代码测试了一下:
#include<iostream>
void fun(int *E)
{
std::cout<<"函数指针形参:"<<sizeof(E)<<std::endl;
}
int main()
{
int A[10];
int *B = new int[10];
//int *&C = A //会报错
int *&D = B;
std::cout<<"数组名:"<<sizeof(A)<<std::endl;
std::cout<<"指针:"<<sizeof(B)<<std::endl;
std::cout<<"指针引用:"<<sizeof(D)<<std::endl;
fun(A);
}
输出结果:
数组名:40
指针:8
指针引用:8
函数指针形参:8
可以看到,当sizeof的参数是数组名时,计算的是整个数组的存储大小;当sizeof的参数是指针时,计算的是指针的大小(8字节,64位系统)。而且,可以定义对指针的引用,但却不能用数组名来作为指针引用的右值,可见数组名和指针还是有区别的。同时,将数组名作为实参传入函数时,因为形参是指针,所以在函数体内的其实是通过数组名初始化的指针形参,故不能在函数中通过 sizeof(指针形参)/sizeof(数组元素类型) 来计算数组长度。所以一般将数组名作为形参传入函数时,也会同时传递一个数组长度的参数。