博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
向函数传递数组的问题
阅读量:5889 次
发布时间:2019-06-19

本文共 1477 字,大约阅读时间需要 4 分钟。

  考虑下面的问题: 

#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; 
} 

 
 

 

转载地址:http://dcfsx.baihongyu.com/

你可能感兴趣的文章
设计模式:外观模式(Façade Pattern)
查看>>
ASP.NET中 DataList(数据列表)的使用前台绑定
查看>>
Linux学习之CentOS(八)--Linux系统的分区概念
查看>>
C语言字节对齐
查看>>
主域控制器的安装与配置步骤与方法
查看>>
调整Flash与div的位置关系
查看>>
Objective - c 创建二维数组
查看>>
〖Android〗/system/etc/fallback_fonts.xml
查看>>
30个美丽干净的,帮助用户专注于内容的网站设计
查看>>
高级Bash脚本编程指南(27):文本处理命令(三)
查看>>
JavaScript---事件
查看>>
Android NDK入门实例 计算斐波那契数列一生成jni头文件
查看>>
c/c++性能优化--I/O优化(上)
查看>>
将HTML特殊转义为实体字符的两种实现方式
查看>>
jquery 保留两个小数的方法
查看>>
网站架构设计的误区
查看>>
Standard C++ Programming: Virtual Functions and Inlining
查看>>
html5 Web Workers
查看>>
iis 故障导致网站无法访问
查看>>
作业抄袭简单检测
查看>>