您的位置:首页 > Web前端

将数组安全地传递给函数的解决方法

2012-03-09 15:28 232 查看
注:本文是我学习C++过程中的一点心得,仅供初学者参考,老鸟就不用浪费时间来看了.

有时我们需要将整个数组的数据传递给某个函数.通常大家如下定义:
int function(int arr[10]);
或者:
int function(int* arr);
其实两者是等价的.数组将被当作指针来传递.于是,下面的调用都是合法的(编译时没有任何错误或警告):
int a[10];

int b[5];

int c;

function(a);

function(b);

function(&c);
甚至如下调用也可:
function(NULL);
于是问题就来了,如何能保证传入的数组是一个有效的包含10个元素的数组呢?显然编译器是无法对此作出保证,我们只有在函数中进行判断了,但是这样的判断也是不好办到的.看来只有在使用该函数时小心一点了.如果有其它人也会调用你写的这个函数,你只有祈求上天保佑了...:)
那么有没有办法来避免这种情况呢?有的,还不少,下面分别来介绍:
以下的介绍适合固定大小的数组:
方法一:使用结构来传递数组:
还是上面那个函数,请如下进行定义:
(1)定义一个结构,仅包含一个数组:
struct INT_ARR_10{

  arr[10];

};
(2)使用该结构的指或者引用作为函数的参数:
int function(const struct INT_ARR_10& ai);
如果你需要从数组返回数据就不要使用const.对于这样定义后的函数,调用时再也不能随便使用其它的类型了(除非强制,使用强制类型出现了问题可就与我无关了:)).但是为了它专门定义一个结构可能有人嫌太麻烦了.那么请继续往下看:
方法二:使用数组的引用来传递:
定义如下:
int function(int (&arr)[10]);
有人说,这样行吗?请试试:
#include <stdio.h>
int function(int (&arr)[10])

{

  return sizeof(arr);

}
int main()

{

  int a[10];

  int b[5];

  int c;
  function(a);

  function(b);

  function(&c);

  function(NULL);
  return 0;

}
我在VC6中编译时出现如下错误:
Compiling...

arrtest.cpp

D:\My Documents\cfile\dos\arrtest.cpp(15) : error C2664: 'function' : cannot convert parameter 1 from 'int [5]' to 'int (&)[10]'

    A reference that is not to 'const' cannot be bound to a non-lvalue

D:\My Documents\cfile\dos\arrtest.cpp(16) : error C2664: 'function' : cannot convert parameter 1 from 'int *' to 'int (&)[10]'

    A reference that is not to 'const' cannot be bound to a non-lvalue

D:\My Documents\cfile\dos\arrtest.cpp(17) : error C2664: 'function' : cannot convert parameter 1 from 'const int' to 'int (&)[10]'

    A reference that is not to 'const' cannot be bound to a non-lvalue

Error executing cl.exe.
arrtest.exe - 3 error(s), 0 warning(s)

看到了吧?除了第一个调用没有错误外,其它三个函数调用全部出错.正在的这个函数仅仅只能使用拥有10个元素的int类固定数组来调用.非此类型的参数在编译时就能发现了.

如果你欲将动态数组传递给函数,使用指针自然是常用的方法,但是,在C++中使用vector模板来代替指针也是更加安全的方法.在MFC中使用CArray模板也是如此:
int function(int* arr);     // 使用指针

int function(int arr[]);     // 使用指针
int function(vector<int>& arr); // 使用STL的向量模板
int function(CArray<int>& arr); // 使用MFC的动态数组模板
使用引用来传递参数的好处在于:引用永远都指向一个有效的对象.你不必为它是否真实存在而担心.
使用指针来传递参数的好处在于:你可以选择是是否使用该指针,如果不需要使用该参数,只要简单地传入一个NULL就行了.而不必来定义一个并不使用的对象.

转自:http://www.xici.net/d15125900.htm
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐