c++中关于数组作为函数参数的几种方法

//由于数组的元素个数默认情况下是不作为实参内容传入调用函数的,本程序用来讨论有此带来的

//相关问题,以及解决问题方法,即给调用函数传递数组的元素个数的几种有效方法并实现它

void PutArray1(int *p,int length);
void PutArray2(int p[],int length);
void PutArray3(int p[10]);
void PutArray4(int (&p)[10]);
void PutArray5(vector<int>verc);


#include<iostream>

#include<vector>

using namespace std;

 

void PutArray1(int *p,int length)

{

    for(int ix=0;ix<length-1;ix++)

    cout<<p[ix]<<"\t";

    cout<<p[ix]<<endl;

}

 

 

void PutArray2(int p[],int length)

{ 

    for(int ix=0;ix<length-1;ix++)

    cout<<p[ix]<<"\t";

    cout<<p[ix]<<endl;

}

 

 

void PutArray3(int p[10])   

{

    for(int ix=0;ix<9;ix++)

    cout<<p[ix]<<"\t";

    cout<<p[ix]<<endl;

}

 

 

void PutArray4(int (&p)[10])//注意对int数组的引用是int (&a)[10],而不是int & a[10],否则有编译错误

{ 

    for(int ix=0;ix<9;ix++)

    cout<<p[ix]<<"\t";

    cout<<p[ix]<<endl;

}

 

 

void PutArray5(vector<int>verc)

{

    vector<int>::iterator begin_iter=verc.begin();

    vector<int>::iterator end_iter=verc.end(); 

    int size=verc.size ();

    cout<<"使用两个迭代器来输出int向量"<<"\n"<<endl;

    for( vector<int>::iterator iter=begin_iter ;iter!=end_iter;iter++)

    cout<<*iter<<"\t";

cout<<endl;

    cout<<"使用向量参数传进来的元素规模输出int向量\n"<<endl;

    for(int ix=0;ix<size-1;ix++)

    cout<<verc[ix]<<"\t";

cout<<verc[ix]<<endl;

}

 

 

void main()

{

    int a[10]={0,1} ,b[8]={0,1};

    vector<int> verc1(a,a+10);

    vector<int> verc2(b,b+8);

    cout<<"数组a[10]调用函数PutArray1的结果为:\n"<<endl;//由此PutArray1PutArray2PutArray3的第一次输出的输出结果可以

    PutArray1(a,10);

    cout<<"数组a[10]调用函数PutArray2的结果为:\n"<<endl;//说明PutArray1int * p)PutArray2int p[])以及PutArray3(int p[10]

    PutArray2(a,10);

cout<<"数组a[10]调用函数PutArray3的结果为:\n"<<endl;//三个函数是等价的;实参传递的都是int *p;他们的元素个数都不作为实参内容传进

    PutArray3(a);                                 

cout<<"数组b[8]调用函数PutArray3的结果为:\n"<<endl; //函数。

    PutArray3(b);

cout<<"向量verc1调用函数PutArray5的结果为:\n"<<endl;

    PutArray5(verc1);

cout<<"向量verc2调用函数PutArray5的结果为:\n"<<endl;

PutArray5(verc2);

}

/*

1)对于数组a[10]作为实参,对所有的以数组作为实参的函数的调用得用PutArray3(a),

而不能用PutArray3(a[10])PutArray(a[])否则出现编译错误,

这是由于数组的大小不作为实参的内容传递的原因

前者出现error C2664: 'PutArray3' : cannot convert parameter 1 from 'int' to 'int []'

后者出现error C2059: syntax error : ']'的提示。

2)注意对PutArray3b)的调用,声明里面形参为int[10],调用的时候传入的实参为int [8],

却能够编译成功,有利的证明了数组实参的元素个数确实是不作为实参的内容传入函数的

运行也没有什么错误,传人的八个元素,显示的确实十个,后面两个是随机的,实际是不属于

数组B的内容的,所以此处容易出现潜在的数组越界错误

(3)调用PutArray4(b)的时候,由于实参是对数组的引用,它的元素个数是作为实参的一部分

传入函数的,所以当调用PutArray4(b)的时候,出现如下的编译错误:

error C2664: 'PutArray4' : cannot convert parameter 1 from 'int [8]' to 'int (&)[10]'

(4)PutArray5(verc1)putArray(verc2)的调用是为了练习对vectoriterator的使用,同时说明了

vector容器类型作为实参的方法也可以用来传递数组的元素个数。

 

总结:可以用来传递数组元素个数的方法有如下3种:

(一)用两个实参,一个是数组名,一个是指出它的长度

(二)使用对数组的引用,此时它的数组元素是作为实参传入函数的

(三)使用vector向量来代替数组

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【资源说明】 课设-基于B+树数据库的图书管理系统c++实现源码(含程序说明+函数文档说明等).zip 程序功能 基础功能 1.登录注册 2.查找书籍(支持多条件查询) a)根据id(唯一) b)根据ISBN c)根据作者 d)根据出版社 3.用户操作 a)借书 b)还书 c)查看自身借阅记录(曾经借还记录,未还记录) 4.管理员操作 a)添加书籍 b)删除书籍 c)修改某ISBN书籍信息 d)查看在借书 e)根据用户id查看其借还记录 f)根据书id查看其被借还记录 g)查看管理员账号的添加书籍,删除书籍记录 其他功能 1.配置文件(热)加载 程序架构 模仿MVC模式,并将程序分为:前端、控制层、服务层、数据层。共4个大层。每个大层可能还会有所区分。 数据层完成数据存储的功能。实现了堆文件、哈希文件两种文件结构。支持对MetaData(元数据)的写入、删除、覆写、查找等功能。 服务层提供数据服务。负责各类数据文件的管理、数据存储的逻辑调用。并且支持将book类转换为MetaData,满足控制层(对各种类操作)到数据层(对MetaData操作)的数据切换。 控制层根据前端指令请求各种服务。例如在借阅书籍时,需要请求修改书籍,也需要请求修改记录。 前端满足用户需求。 数据存储形式 在数据层,所有的数据都以MetaData(元数据)形式进行组织,不做语义上的区分。MetaData即为固定长度的字符数组(char[BUFFER_LENGTH],BUFFER_LENGTH是长度,可在配置文件修改)。 因此在访问文件时,一次仅能在index * BUFFER_LENGTH上取出BUFFER_LENGTH长度的数据,其index是第几个MetaData(可理解为元数据在文件下的地址)。至于MetaData存储内容的含义,与数据表的含义有关。 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
Delphi制作DLL •一 Dll的制作一般分为以下几步: 1 在一个DLL工程里写一个过程或函数 2 写一个Exports关键字,在其下写过程的名称。不用写参数和调用后缀。 二参数传递 1 参数类型最好与window C++的参数类型一致。不要用DELPHI的数据类型。 2 最好有返回值[即使是一个过程],来报出调用成功或失败,或状态。成功或失败的返回值最好为1[成功]或0[失败].一句话,与windows c++兼容。 3 用stdcall声明后缀。 4 最好大小写敏感。 5 无须用far调用后缀,那只是为了与windows 16位程序兼容。 三 DLL的初始化和退出清理[如果需要初始化和退出清理] 1 DLLProc[SysUtils单元的一个Pointer]是DLL的入口。在此你可用你的函数替换了它的入口。但你的函数必须符合以下要求[其实就是一个回调函数]。如下: procedure DllEnterPoint(dwReason: DWORD);far;stdcall; dwReason参数有四种类型: DLL_PROCESS_ATTACH:进程进入时 DLL_PROCESS_DETACH进程退出时 DLL_THREAD_ATTACH 线程进入时 DLL_THREAD_DETACH 线程退出时 在初始化部分写: DLLProc := @DLLEnterPoint; DllEnterPoint(DLL_PROCESS_ATTACH); 2 如Form上有TdcomConnection组件,就Uses Activex,在初始化时写一句CoInitialize (nil); 3 在退出时一定保证DcomConnection.Connected := False,并且数据集已关闭。否则报地址错。 四全局变量的使用 在widnows 32位程序,两个应用程序的地址空间是相互没有联系的。虽然DLL在内存是一份, 但变量是在各进程的地址空间,因此你不能借助dll的全局变量来达到两个应用程序间的数据 传递,除非你用内存映像文件。 五、其他:调用方式按照标准的Windows调用方式. 六、关于参数传递 •Delphi程序之间调用DLL,如果要用String类型的话,要在引用的单元加上ShareMem 单元。 •如果Delphi写的DLL供其他开发工具使用的话,不要使用String类型,用PAnsiChar类型。 尽量使用标准DLL接口。指的是传递的参数类型及函数返回类型不能是Delphi特有的, 比如string(AnsiString),以及动态数组和含有这些类型成员的复合类型(如记录),也不 能是包含有这些类型成员数据成员的对象类型,以避免可能的错误。如果使用了string类型或 动态数组类型,且调用方不是Delphi程序,则基本上会报错。如果调用方是Delphi但调用方或 被调用方没有在工程文件的第一包含单元不是ShareMem,也可能会出错。 七、关于回调Funciton 你可以把Callback函数看作是一种特殊的消息响应函数,一般来说我们不会自己调用这种函数, 而是有某些系统函数调用,而且不需要向后传递消息。 只要象C/C++这样支持函数指针的语言都 有回调函数的概念,它实际上是向被调用函数传一个你的函数地址,然后被调用函数向通过你传 入的函数地址来调用你的函数 。 以上是结构化回调,到高级语言Object Pascal、C++回调函数并没有退出,反而得到延伸与 扩展,在面向对像的回调,其实是指面向对像类对像的事件,事件就是原始的回调函数。面 向对像, 将回调函数定义成事件过程,在程序引用对像时,若指定了对像的过程事件后,那么在 要进行事件触发的地方检查事件过程是否分配,如果分的就执行事,也就是执行了回调函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值