下面代码的运行结果是?
int GetSize(int data[]){
return sizeof(data);
}
int _tmain(int argc, _TCHAR* argv[])
{
int data1[] = {1,2,3,4,5};
int size1 = sizeof(data1);
int* data2 = data1;
int size2 = sizeof(data2);
int size3 = GetSize(data1);
printf("%d, %d, %d",size1, size2, size3);
}
- 分析
data1是一个数组,sizeof(data1)是求数组的大小。这个数组包含5个整数,每个整数占4字节,因此总共占用20字节。data2声明为指针,尽管它指向了数组data1的第一个数字,但它的本质仍然是一个指针。在32位系统上,对任意指针求sizeof,得到的结果都是4。在C/C++中,当数组作为函数的参数进行传递时,数组就自动退化为同类型的指针。因此,尽管函数GetSize的参数data被声明为数组,但它会退化为指针,size3的结果仍然是4。答案:20, 4, 4
相关知识点:
除了以下三种情况外,在使用数组时,数组都会自动转换为指向第一个元素的指针:
情况1:数组用作取地址操作符&的操作数
情况2:数组用作sizeof操作符的操作数
情况3:用数组对数组的引用进行初始化
int main()
{
char a[] = {'1', '3', '5', '7', '9'};
char (&b)[5] = a;
cout << sizeof(a) << endl;
cout << sizeof(*a) << endl;
cout << sizeof(&a) << endl;
cout << sizeof(a[0]) << endl;
cout << sizeof(&a[0]) << endl;
cout << *((char*)(&a + 1) - 1) << endl;
cout << sizeof(b) << endl;
cout << sizeof(*b) << endl;
cout << sizeof(&b) << endl;
cout << sizeof(b[0]) << endl;
cout << sizeof(&b[0]) << endl;
return 0;
}
答案:5 1 4 1 4 9 5 1 4 1 4