本文的学习内容参考: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. Storm系列(十四)架构分析之Executor-输入和输出处理

    Executor的数据 mk-executor-data函数用于定义Executor中含有的数据. Executor的输入处理 根据executor-id从Worker的:executor-recei ...

  2. win7 下恢复“经典任务栏”/“快速启动栏”,关闭“窗口自动最大化” -摘自网络

    1.自动放大窗口 鼠标把窗口拖到屏幕边缘时,win7会自做聪明的把窗口放大,有时候这个很烦人. 解决办法: 运行“REGEDIT”打开注册表,找到 “HKEY_CURRENT_USER\Control ...

  3. FireFox浏览器的下载和安装、借助RamDisk让你的FireFox飞起来

    想说的是,为什么我要写此博文,算是纪念我对FireFox浏览器的一个入门.最近,开始接触了它,看到了很多IT牛人极力推荐使用 “ FireFox浏览器 ”作为开发. 深得大牛指导! 下载 安装 这是, ...

  4. 教程-Delphi7 自带控件安装对应表

    原来的控件delphi7里何处寻? 经常有朋友提这样的问题,“我原来在delphi5或者delphi6中用的很熟的控件到哪里去了?是不是在delphi7中没有了呢?这是不是意味着我以前写的代码全都不能 ...

  5. Art Gallery - POJ 1279(求内核面积)

    同上面几道题差不多,需要先求出来内核,然后直接用叉积求出来面积即可. 代码如下: #include<iostream> #include<string.h> #include& ...

  6. JS好的学习网站

    1.JavaScript 秘密花园 2.W3CSchool 3.js严格模式 4.js核心之原型 5.尼古拉斯怎么面试前端工程师 6.zepto中文版api 7.jquery API

  7. WinForm Excel导入

     主要代码如下: 定义一个DataSet   存放Excel读取的数据 /// <summary> /// Excel 表中读取的数据 /// </summary> publi ...

  8. chrome扩展——Postman

    今天须要測试一个http的接口,曾经都是使用java的httpClient工具jar,自己编写代码去调试,但这样的方式比較死板,每次都要执行一段代码...于是就像有没有类似的在线工具能够使用? 调查了 ...

  9. JavaScript常用正则表达式与应用(一)

    JavaScript的String类和RegExp对象类都定义了相关方法使用正则表达式进行模式匹配,本文将以连载方式介绍JavaScript常用正则表达式与相关应用,欢迎交流 本节是连载一,首先介绍J ...

  10. 在不同平台上CocosDenshion所支持的音频格式

    在大多数平台上,cocos2d-x调用不同的SDK API来播放背景音乐和音效.CocosDenshion在同一时间只能播放一首背景音乐,但是能同时播放多个音效. 背景音乐 Platform supp ...