本文的学习内容参考:http://blog.csdn.net/wwdlk/article/details/6322843

1.当用数组名作为函数参数时,函数的实参和形参都应为数组名(或者指针);

Example1:有一个一维数组score,内放10个学生成绩,求平均成绩。

#include<iostream>
using namespace std; float average(float array[],int num) {
int i;
float aver, sum = array[];
for (i = ; i< num; i++)
sum = sum + array[i];
aver = sum / num;
return aver;
}
int main()
{
float aver;
int number;
cout << "please input number:";
cin >> number;
float *score = new float[number]; //动态创建一维数组score
if (score == NULL) //检查内存空间是否分配完成
{
cout << "could not allocate.Bye..." << endl;
exit();
}
cout << "please input secores:" << endl;
for (int i = ; i < number; i++)
cin >> score[i];
cout << endl;
aver = average(score,number);//数组名作为函数参数
cout << "the average score is " << aver << endl;
system("pause");
return ;
}

说明:

(1)用数组名称作函数参数,应该在主调函数和被调函数分别定义数组,本例中array是形参数组名,score是实参数组名,分别在其所在的函数中定义,不能只在一方定义;

(2)实参数组与形参数组类型应该保持一致(这里都为float型);

(3)形参数组可以不指定大小,此时可以在定义数组时,在数组名后面跟一个空的方括号;当需要在被调用函数中处理数组元素时,可以另设一个参数,传递需要处理的数组元素的个数;

如下所示,根据不同的数组长度来处理不同的数据Demo

#include<iostream>
using namespace std;
float average(float array[], int n) {
int i;
float aver, sum = array[];
for (i = ; i<n; i++)sum = sum + array[i];
aver = sum / n;
return aver;
} void main() {
float score_1[] = { 98.5,,91.5,, };
float score_2[] = { 67.5,89.5,,69.5,,89.5,76.5,,,99.5 };
cout << "the average of class A is :" << average(score_1, ) << endl;
cout << "the average of class B is :" << average(score_2, ) << endl;
system("pause");
return;
}

(4)用数组名作为函数实参的时,不是把数组元素的值传递给形参,而是把实参数组的起始地址传递给形参数组,这样两个数组就共占同一段内存单元

2.用数组作为函数参数的集中情况(学习内容参考http://blog.csdn.net/zeusuperman1/article/details/8509287)

#include<iostream>
#include<vector>
using namespace std; char s[] = "";
int a[] = { , };
int b[] = { , };
void Display(char *c);
void PutArray1(int *p, int length);
void PutArray2(int p[], int length);
void PutArray3(int p[]);
void PutArray4(int(&p)[]);            
void PutArray5(vector<int> vec);          //向量作为函数参数 void main()
{
char q;
vector<int> vector(,);
cout << "这个是在主函数中对数组长度的测试:" << sizeof(s) << endl;
Display(s);
cout << "-------------------------------" << endl;
PutArray1(a, );
PutArray2(a, );
PutArray3(a);
PutArray4(b);
PutArray5(vector);
system("pause");
return;
}
void Display(char *c)
{
cout << "这个是在子函数中对数组长度的测试:" << sizeof(c) << endl;
}
void PutArray1(int *p, int len)
{
int length1 = sizeof(p);
cout << "第一种方法的输出:" << endl;
cout << "第一种方法数组的长度为:" << length1 << endl;
for (int i = ;i < length1;i++)
{
cout << p[i] << " ";
}
cout << endl;
}
void PutArray2(int p[], int len)
{
int length = sizeof(p);
cout << "第二种方法的输出:" << endl;
cout << "第二种方法数组的长度为:" << length << endl;
for (int i = ;i < length;i++)
{
cout << p[i] << " ";
}
cout << endl;
}
void PutArray3(int p[])
{
int length = sizeof(p);
cout << "第三种方法的输出:" << endl;
cout << "第三种方法数组的长度为:" << length << endl;
for (int i = ;i < length;i++)
{
cout << p[i] << " ";
}
cout << endl;
}
void PutArray4(int(&p)[])
{
int length = sizeof(p);
cout << "第四种方法的输出:" << endl;
cout << "第四种方法数组的长度为:" << length << endl;
for (int i = ;i < length;i++)
{
cout << p[i] << " ";
}
cout << endl;
} void PutArray5(vector<int> vec)
{
vector<int>::iterator begin_iter = vec.begin();
vector<int>::iterator end_iter = vec.end();
int size = vec.size();
cout << "第五种方法的输出:" << endl;
cout << "第五种方法数组的长度为:" << size << endl;
cout << "下面这种方法是采用向量遍历的方法遍历数组:" << endl;
for (vector<int>::iterator iter = begin_iter;iter != end_iter;iter++)
{
cout << *iter << " ";
}
cout << endl;
cout << "下面这种方法是采用普通遍历数组的方法遍历数组:" << endl;
for (int i = ;i < size;i++)
{
cout << vec[i] << " ";
}
cout << endl;
}

result:

总结:

(1)在这里,int *arrint arr[]含义相同,编译器自动将 int arr[]替换为int *arr,所以这也解释了上面在主函数和子函数中利用数组名求数组长度会得到不同结果的原因。这种情况只有在数组作为函数参数进行传递时才会发生;

(2)在子函数中无法直接获得作为参数的数组的长度,因此数组的长度必须在函数中作为参数进行传递;

C++数组(指针)作为函数参数的更多相关文章

  1. go语言基础之数组指针做函数参数

    1.数组指针做函数参数 示例: package main //必须有个main包 import "fmt" //p指向实现数组a,它是指向数组,它是数组指针 //*p代表指针所指向 ...

  2. [GO]数组指针做函数参数

    package main import "fmt" //p指向实现数组a,它是指向数组,它是数组指针//*p指向指针指向的内存,就是实参a func modify1(p *[]in ...

  3. C++ 二维数组(双重指针作为函数参数)

    本文的学习内容参考:http://blog.csdn.net/yunyun1886358/article/details/5659851 http://blog.csdn.net/xudongdong ...

  4. C++ —— 返回数组指针的函数 和 返回指向函数的指针的函数

    返回数组指针的函数 基础知识:数组不能被拷贝,函数不能返回数组,只能返回数组的指针或者引用. 定义一个 返回数组指针的函数 的方法,以 一个接收参数为 含有10个整型元素的数组的引用  和 返回一个含 ...

  5. Day8 函数指针做函数参数

    课堂笔记 课程回顾         多态 virtual关键字 纯虚函数 virtual func() = 0;         提前布局vptr指针 面向接口编程 延迟绑定 多态的析构函数的虚函数. ...

  6. Z :彻底了解指针数组,数组指针以及函数指针 [复

    原创 :彻底了解指针数组,数组指针以及函数指针 [复制链接] 00 roking 白手起家 帖子 60 主题 16 精华 0 可用积分 74 专家积分 0 在线时间 0 小时 注册时间 2003-10 ...

  7. [编程] C语言结构体指针作为函数参数

    结构体指针作为函数参数:结构体变量名代表的是整个集合本身,作为函数参数时传递的整个集合,也就是所有成员,而不是像数组一样被编译器转换成一个指针.如果结构体成员较多,尤其是成员为数组时,传送的时间和空间 ...

  8. c++中指针作为函数参数的详细理解

    在C语言中,函数的参数不仅可以是整数.小数.字符等具体的数据,还可以是指向它们的指针.用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着 ...

  9. 数组名作为函数参数以及sizeof用法

    来源:https://blog.csdn.net/jay_zhouxl/article/details/51745518 int f(int *p,char *a) { printf("p[ ...

  10. [笔记]C++声明返回数组指针的函数

    数组指针的声明:type (*name)[size]; 由于数组不能拷贝,所以函数不能返回数组.但是函数可以返回指针和引用,所以函数可以返回数组指针或引用. 和数组指针的声明类似: type (*fu ...

随机推荐

  1. vim配置vimrc详解

    vimrc的存放位置: 系统 vimrc 文件: "$VIM/vimrc" 用户 vimrc 文件: "$HOME/.vimrc" 用户 exrc 文件: &q ...

  2. groupinfo

    http://www.wenzizone.com/2011/07/07/centos_x64_yum_da_jian_xen.html [yum xen] 配置epel就不说了,ruiy哥的文档有; ...

  3. poj 2325 Persistent Numbers (贪心+高精度)

    把输入数字每次从9-2除,能整除则记录该数字,最后从小到大输出. 应该算是水题,不过窝第一次写高精度除法,虽然1A,不过中间改了好多次. /****************************** ...

  4. 教程-Delphi操作快捷键

    ************************************************************** Delphi快捷键-全-高手用-南山古桃(新手)-同学共进 ******* ...

  5. XI.spring的点点滴滴--IObjectFactoryPostProcessor(工厂后处理器)

    承接上文 IObjectFactoryPostProcessor(工厂后处理器)) 前提是实现接口的对象注册给当前容器 直接继承的对象调用这个postProcessBeanFactory方法,参数为工 ...

  6. PHP获取Cookie模拟登录CURL(转)

    要提取google搜索的部分数据,发现google对于软件抓取它的数据屏蔽的厉害,以前伪造下 USER-AGENT 就可以抓数据,但是现在却不行了.利用抓包数据发现,Google 判断了 cookie ...

  7. Nginx下载服务生产服务器调优

    一.内存调优 内核关于内存的选项都在/proc/sys/vm目录下.   1.pdflush,用于回写内存中的脏数据到硬盘.可以通过 /proc/sys/vm/vm.dirty_background_ ...

  8. 有关Color和Drawable你所不知道的那些内容

    Android开发中,我们经常会用到Color或Drawable,有时他们是可以混用的,有时却有严格的区别. Drawable 体系结构 Drawable是可绘制物件的一般抽象.与View不同,Dra ...

  9. maven项目在tomcat中运行遇到的问题

    在使用maven构建项目,并在tomcat容器中运行的时候遇到了一些问题,现做一下记录 maven项目中jdk版本会自动恢复 maven项目的编译jdk即使在window -> java -&g ...

  10. 11.13 noip模拟试题

    题目名称 笔记 括号 城堡可执行文件名 note brackets castle输入文件名 note.in brackets.in castle.in输出文件名 note.in brackets.ou ...