将数组安全地传递给函数的解决方法
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
有时我们需要将整个数组的数据传递给某个函数.通常大家如下定义:
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
相关文章推荐
- thinkphp 中 dump 函数调试数组时显示不全解决方法
- VB几种函数参数传递方法,Variant,数组,Optional,ParamArray
- 1:HTML 中 onclick 触发函数 xxx(param) 要传递对象参数的解决方法 2:LocalStorage存储JSON对象的问题 3:ajax请求传送参数为对象问题
- 最保险的函数间数组作为参数值传递与返回方法,用memcpy函数!
- SQL中函数返回表,传递一个参数,无法唤醒用户自定义函数,解决方法!
- QT 自定义信号与信号槽方法及解决自定义数据类型或数组作为函数参数的问题
- jQuery.ajax向后台传递数组问题的解决方法
- 数组作为函数参数并传递数组元素个数的几种有效方法
- c++中关于数组作为函数参数并传递数组元素个数的几种有效方法的讨论
- c++中关于数组作为函数参数并传递数组元素个数的几种有效方法的讨论
- 【C】函数间传递多维数组的方法
- 数组作为函数参数的传递方法
- c语言中用函数传递数组的两个方法
- 程序中和有js函数的网页交互,线程中调用 get_Script 就会错误的解决方法,由于COM的线程安全问题
- 指针变量向函数中传递的陷阱及解决方法
- perl函数中传递数组的方法
- 给数据库传递组合字符串参数,类似数组的解决方法
- JS中setInterval、setTimeout不能传递带参数的函数的解决方法
- Matlab solve函数参数传递问题解决方法
- QT 自定义信号与信号槽方法及解决自定义数据类型或数组作为函数参数的问题