C++数组(指针)作为函数参数
本文的学习内容参考: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 *arr和int arr[]的含义相同,编译器自动将 int arr[]替换为int *arr,所以这也解释了上面在主函数和子函数中利用数组名求数组长度会得到不同结果的原因。这种情况只有在数组作为函数参数进行传递时才会发生;
(2)在子函数中无法直接获得作为参数的数组的长度,因此数组的长度必须在函数中作为参数进行传递;
C++数组(指针)作为函数参数的更多相关文章
- go语言基础之数组指针做函数参数
1.数组指针做函数参数 示例: package main //必须有个main包 import "fmt" //p指向实现数组a,它是指向数组,它是数组指针 //*p代表指针所指向 ...
- [GO]数组指针做函数参数
package main import "fmt" //p指向实现数组a,它是指向数组,它是数组指针//*p指向指针指向的内存,就是实参a func modify1(p *[]in ...
- C++ 二维数组(双重指针作为函数参数)
本文的学习内容参考:http://blog.csdn.net/yunyun1886358/article/details/5659851 http://blog.csdn.net/xudongdong ...
- C++ —— 返回数组指针的函数 和 返回指向函数的指针的函数
返回数组指针的函数 基础知识:数组不能被拷贝,函数不能返回数组,只能返回数组的指针或者引用. 定义一个 返回数组指针的函数 的方法,以 一个接收参数为 含有10个整型元素的数组的引用 和 返回一个含 ...
- Day8 函数指针做函数参数
课堂笔记 课程回顾 多态 virtual关键字 纯虚函数 virtual func() = 0; 提前布局vptr指针 面向接口编程 延迟绑定 多态的析构函数的虚函数. ...
- Z :彻底了解指针数组,数组指针以及函数指针 [复
原创 :彻底了解指针数组,数组指针以及函数指针 [复制链接] 00 roking 白手起家 帖子 60 主题 16 精华 0 可用积分 74 专家积分 0 在线时间 0 小时 注册时间 2003-10 ...
- [编程] C语言结构体指针作为函数参数
结构体指针作为函数参数:结构体变量名代表的是整个集合本身,作为函数参数时传递的整个集合,也就是所有成员,而不是像数组一样被编译器转换成一个指针.如果结构体成员较多,尤其是成员为数组时,传送的时间和空间 ...
- c++中指针作为函数参数的详细理解
在C语言中,函数的参数不仅可以是整数.小数.字符等具体的数据,还可以是指向它们的指针.用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着 ...
- 数组名作为函数参数以及sizeof用法
来源:https://blog.csdn.net/jay_zhouxl/article/details/51745518 int f(int *p,char *a) { printf("p[ ...
- [笔记]C++声明返回数组指针的函数
数组指针的声明:type (*name)[size]; 由于数组不能拷贝,所以函数不能返回数组.但是函数可以返回指针和引用,所以函数可以返回数组指针或引用. 和数组指针的声明类似: type (*fu ...
随机推荐
- 什么是JSON?如何使用?它比BSON更好吗?
本文由码农网 – 小峰原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! 长话短说:如果你想知道JSON——它是什么,如何使用它以及它和BSON哪个更好,那么你来对地方了.在本文中,我们 ...
- yii 获取系统级请求参数的常用方法
1.GET/POST 1.1.获取GET/POST过来的数据 Yii::app()->request->getParam('id'); 1.2.判断数据提交方式 Yii::app()-&g ...
- PC-大概最全的黑客工具表了
纯真IP数据库查询程序 remote administrator (rar解密)ZiperelloV2.0 汉化版.zip (代理跳板)SkSockServer1.09.zip [ar ...
- Xcode7 低版本iOS系统上下有黑边的问题
在使用Xcode7开发时,默认的启动页改成了 Launch Screen storyboard.通常情况下还是习惯使用 LaunchImage,介绍下Xcode7 下如何改为启动页是LaunchIma ...
- PureMVC(JS版)源码解析:总结
PureMVC源码中设计到的11个类已经全部解析完了,回首想想,花了一周的时间做的这点事情还是挺值得的,自己的文字组织表达能力和对pureMVC的理解也在写博客的过程中得到了些提升.我也是第一次写系列 ...
- iOS开发简单高效的数据存储
在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题,你是用什么方法来持久保存数据的?这是在几乎每一次关于iOS技术的交流或讨论都会被提到的问题,而且大家对这个问题的热情持续高涨.本文主要从概 ...
- Copy-On-Write技术 (摘录)
Copy-On-Write技术 Copy-On-Write是写时才copy的意思,有延迟操作的意思在里面.比如往磁盘写数据,先写到的是内存里面,只有文件close或flush时才真正写到磁盘. ...
- Android(java)学习笔记166:Java中输入和输出流概念
程序在内存中运行,文件在磁盘上,把文件从磁盘上读入内存中来,当然是输入流了, 反之,把内存中的数据写到磁盘上的文件里面去就是输出.通常都是这样的,用了过滤流的情况复杂一些,则另当别论.
- javascript变量提升
提升是一种将变量和函数的声明移到函数作用域(如果不在任何函数内的话就是全局作用域)最顶部的机制. 提升影响了变量的生命周期,一个变量的生命周期包含3个阶段: 声明——创建一个新变量,例如var myV ...
- 关于ActiveMQ的问题分析
目前常用的消息队列组建无非就是MSMQ和ActiveMQ,至于他们的异同,这里不想做过多的比较.简单来说,MSMQ内置于微软操作系统之中,在部署上包含一个隐性条件:Server需要是微软操作系统.(对 ...