最近看到这么一道题目:
//请输出下面代码的结果:
//答案:6
#include<iostream>
using std::cin;
using std::cout;
using std::endl;
int function(char arr[]);
int main()
{
char array[] = "ABCDEF";
cout << function(array) << endl;
}
int function(char arr[])
{
int sum = 0;
int len = sizeof(arr) / sizeof(char);
for (int i = 0; i < len; ++i)
{
sum += (arr[i] - 'A');
}
return sum;
}
先看vs2019运行结果:确实如此。
试着分析:
int function(char arr[])
{
int sum = 0;
int len = sizeof(arr) / sizeof(char);
for (int i = 0; i < len; ++i)
{
sum += (arr[i] - 'A');
//char array[] = "ABCDEF";
}
return sum;
}
一开始,我的想法是:arr分别是A B C D E F 在与A做减法时,强制转成int型,sum相继加上0 1 2 3 4 5,结果不应该是15吗?为什么会是6?
先做一下实验:输出sizeof(arr),发现是4!
这样一来问题就清晰了:
将数组作为函数参数的时候,实际上就是传进去一个指针(指向数组的首元素),然后在参数列表上哪怕你是写明了这是一个数组且他的长度是多少,编译器只认为这是一个指针,而不是一个数组,sizeof得到的结果就永远是4,所以我们在把数组作为函数参数的时候还要把数组的大小传进去。