考虑下面的问题: #include <iostream> using namespace std; int Sum(int i[]) { int sumofi = 0; for (int j = 0; j < sizeof(i)/sizeof(int); j++) // 实际上, sizeof(i) = 4 { sumofi += i[j]; } return sumofi; } int main() { int allAges[6] = {21, 22, 22, 19, 34, 12}; cout<<Sum(allAges)<<endl; system("pause"); return 0; } Sum 的本意是用 sizeof 得到数组的大小,然后求和。但是实际上,传入自函数 Sum 的,只是一个 int 类型的指针,所以 sizeof(i)=4 ,而不是 24 ,所以会产生错误的结果。解决这个问题的方法使是用指针或者引用。 使用指针的情况: int Sum(int (*i)[6]) { int sumofi = 0; for (int j = 0; j < sizeof(*i)/sizeof(int); j++) //sizeof(*i) = 24 { sumofi += (*i)[j]; } return sumofi; } int main() { int allAges[] = {21, 22, 22, 19, 34, 12}; cout<<Sum(&allAges)<<endl; system("pause"); return 0; } 在这个 Sum 里, i 是一个指向 i[6] 类型的指针,注意,这里不能用 int Sum(int (*i)[]) 声明函数,而是必须指明要传入的数组的大小,不然 sizeof(*i) 无法计算。但是在这种情况下,再通过 sizeof 来计算数组大小已经没有意义了,因为此时大小是指定为 6 的。 使用引用的情况和指针相似: int Sum(int (&i)[6]) { int sumofi = 0; for (int j = 0; j < sizeof(i)/sizeof(int); j++) { sumofi += i[j]; } return sumofi; } int main() { int allAges[] = {21, 22, 22, 19, 34, 12}; cout<<Sum(allAges)<<endl; system("pause"); return 0; } 这种情况下 sizeof 的计算同样无意义,所以用数组做参数,而且需要遍历的时候,函数应该有一个参数来说明数组的大小,而数组的大小在数组定义的作用域内通过 sizeof 求值。因此上面的函数正确形式应该是: #include <iostream> using namespace std; int Sum(int *i, unsigned int n) { int sumofi = 0; for (int j = 0; j < n; j++) { sumofi += i[j]; } return sumofi; } int main() { int allAges[] = {21, 22, 22, 19, 34, 12}; cout<<Sum(i, sizeof(allAges)/sizeof(int))<<endl; system("pause"); return 0; }