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

注:本文是我学习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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值