向函数传递数组的问题

  考虑下面的问题: 
#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; 
} 

posted @ 2012-03-20 16:31  Piosa  阅读(1805)  评论(0编辑  收藏  举报