C++给函数传数组参数
2016-04-15 23:14
375 查看
from:
http://blog.csdn.net/hongjiqin/article/details/5739935
在C++中,如果要给一个函数传入一个数组,一般都是传入两个参数一个数组指针和一个数组大小
例:
void print_1 (int n, int *datas )
{
for (int i = 0; i < n; ++i)
{
std::cout << datas[i] << " ";
}
std::cout << std::endl;
}
对这个函数,我们可以这样使用它:
const int N = 3;
int datas
= {1, 2, 3};
print_1 (N, datas);
不过对这个函数,我们可能会传错 n 的大小,而在运行时可能出错,例如这样使用:
const int N = 3;
int datas
= {1, 2, 3};
print_1 (4 ,
datas);
有些时候,我们希望某函数只接受指定大小的数组,例如我们希望只接受大小为 3 的数组:
void print_2 (int datas[3] )
{
for (int i = 0; i < 3 ;
++i)
{
std::cout << datas[i] << " ";
}
std::cout << std::endl;
}
但实际上,上面的函数不能正确工作:
const int N = 3;
int datas
= {1, 2, 3};
print_2 (datas);
int datas2[N - 1] = {1, 2};
print_2 (datas2);
也就是我们传入了一个大小为 2 的数组,编译器没报任何错误,我们的函数接口 print_2 (int datas[3 ])
中的 3 没起任何作用
事实上,上面的函数接口应该这样写:
void print_3 (int (&datas) [3])
{
for (int i = 0; i < 3; ++i)
{
std::cout << datas[i] << " ";
}
std::cout << std::endl;
}
这时,我们如果这样使用是正确的
const int N = 3;
int datas
= {1, 2, 3};
print_3 (datas);
而我们如果这样使用,编译器会报错
int datas2[N - 1] = {1, 2};
print_3 (datas2);
在上面这个例子(print_3)的基础上,我们可以使用模板进行泛型实现
template<int N>
void print_4 (int (&datas)
)
{
for (int i = 0; i < N; ++i)
{
std::cout << datas[i] << " ";
}
std::cout << std::endl;
}
这时候,我们可以传递任意大小数组,而不担心给函数传入了错误的参数
const int N = 3;
int datas
= {1, 2, 3};
print_4 (datas);
int datas2[N - 1] = {1, 2};
print_4 (datas2);
假如我们给传了错误参数,函数将会报错
const int N = 3;
int datas
= {1, 2, 3};
print_4<4 >
(datas);
http://blog.csdn.net/hongjiqin/article/details/5739935
在C++中,如果要给一个函数传入一个数组,一般都是传入两个参数一个数组指针和一个数组大小
例:
void print_1 (int n, int *datas )
{
for (int i = 0; i < n; ++i)
{
std::cout << datas[i] << " ";
}
std::cout << std::endl;
}
对这个函数,我们可以这样使用它:
const int N = 3;
int datas
= {1, 2, 3};
print_1 (N, datas);
不过对这个函数,我们可能会传错 n 的大小,而在运行时可能出错,例如这样使用:
const int N = 3;
int datas
= {1, 2, 3};
print_1 (4 ,
datas);
有些时候,我们希望某函数只接受指定大小的数组,例如我们希望只接受大小为 3 的数组:
void print_2 (int datas[3] )
{
for (int i = 0; i < 3 ;
++i)
{
std::cout << datas[i] << " ";
}
std::cout << std::endl;
}
但实际上,上面的函数不能正确工作:
const int N = 3;
int datas
= {1, 2, 3};
print_2 (datas);
int datas2[N - 1] = {1, 2};
print_2 (datas2);
也就是我们传入了一个大小为 2 的数组,编译器没报任何错误,我们的函数接口 print_2 (int datas[3 ])
中的 3 没起任何作用
事实上,上面的函数接口应该这样写:
void print_3 (int (&datas) [3])
{
for (int i = 0; i < 3; ++i)
{
std::cout << datas[i] << " ";
}
std::cout << std::endl;
}
这时,我们如果这样使用是正确的
const int N = 3;
int datas
= {1, 2, 3};
print_3 (datas);
而我们如果这样使用,编译器会报错
int datas2[N - 1] = {1, 2};
print_3 (datas2);
在上面这个例子(print_3)的基础上,我们可以使用模板进行泛型实现
template<int N>
void print_4 (int (&datas)
)
{
for (int i = 0; i < N; ++i)
{
std::cout << datas[i] << " ";
}
std::cout << std::endl;
}
这时候,我们可以传递任意大小数组,而不担心给函数传入了错误的参数
const int N = 3;
int datas
= {1, 2, 3};
print_4 (datas);
int datas2[N - 1] = {1, 2};
print_4 (datas2);
假如我们给传了错误参数,函数将会报错
const int N = 3;
int datas
= {1, 2, 3};
print_4<4 >
(datas);
相关文章推荐
- C++ <string><string.h>函数区别
- C++第二次作业补充
- C/C++语言中NULL、'\0’和0的区别
- C++/C代码规范(个人)(不断更新)
- C++第二次实验补充
- C++ 命名空间 namespace 知多少
- C++ 中关于默认构造函数的一点困惑
- VS 创建 使用C++ 静态类库(Dll)
- effective c++读书笔记(一)
- C++实践参考:数组作数据成员
- c++ cin和cout对象
- C++中的小错误
- 2015级C++第8周项目 数组和指针
- stl关联容器
- C++第三次实验—友元类
- 栈的应用-表达式求值
- c++下为使用pimpl方法的类编写高效的swap函数
- 全局变量、静态全局变量、静态局部变量和局部变量的区别
- 单片机中的C语言
- C++: 二维数组作函数参数