C++之安全使用数组的4中方法
2015-09-27 00:41
387 查看
数组有两个特质:
1. 不能复制(有些编译器将数组复制作为编译器扩展)
2. 使用数组名时,自动将其转为为指向数组第一个元素的指针(隐式类型转换)
上面两个特征决定了处理数组的函数通常通过指向数组元素的指针来处理数组内容
一下几个数组形参定义是等价的:
1. void fuck(int *p);
2. void fuck(int p[]);
3. void fuck(int p[10]);
C++不会检查数组形参的长度。。。。
这种情况下, 要安全的使用数组(不出现访问越界),有以下几种方式:
1. 在数组中人为增加结束标识, 类似C风格字符串以\0 为结束标识;
2. 仿照C++标准库做法, 使用两个指针,一个指向最初始元素,一个指向最末元素的下一个元素;
3. 显示的传入数组长度这个参数
下面代码实现数组求和的功能, 分别使用了上面3中方法:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
// the arry is end of \0 , like const char arry
int arry_sum1(int *p)
{
int sum =0;
while(*p != NULL)
{
sum += *p;
++p;
}
return sum;
}
int arry_sum2(int *p, size_t len)
{
int sum =0;
for(size_t i = 0 ; i < len ; ++i)
{
sum += p[i];
}
return sum;
}
int arry_sum3(int *pBegin, int * pEnd)
{
int sum = 0;
for(int * pIndex = pBegin; pIndex != pEnd ; ++ pIndex)
sum += *pIndex;
return sum;
}
int main(int argc, char* argv[])
{
int a[]={1,2,3,4,5,6,7,8,9,NULL};
cout<<arry_sum1(a)<<endl;
int b[] ={1,2,3,4,5,6,7,8,9};
cout<<arry_sum2(b,9)<<endl;
int *p1 =b;
int *p2 = b+9;
cout<<arry_sum3(p1,p2)<<endl;
return 0;
}
=====================================================================
另一种安全的方式是通过引用来使用数组
void fuck(int (&a)[10]);
当使用引用形参时,传递的是数组对象本身,此时编译器的类型检查会检查参数类型以及数组长度, 而不会忽略参数中的数组长度, 因而是安全的
1. 不能复制(有些编译器将数组复制作为编译器扩展)
2. 使用数组名时,自动将其转为为指向数组第一个元素的指针(隐式类型转换)
上面两个特征决定了处理数组的函数通常通过指向数组元素的指针来处理数组内容
一下几个数组形参定义是等价的:
1. void fuck(int *p);
2. void fuck(int p[]);
3. void fuck(int p[10]);
C++不会检查数组形参的长度。。。。
这种情况下, 要安全的使用数组(不出现访问越界),有以下几种方式:
1. 在数组中人为增加结束标识, 类似C风格字符串以\0 为结束标识;
2. 仿照C++标准库做法, 使用两个指针,一个指向最初始元素,一个指向最末元素的下一个元素;
3. 显示的传入数组长度这个参数
下面代码实现数组求和的功能, 分别使用了上面3中方法:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
// the arry is end of \0 , like const char arry
int arry_sum1(int *p)
{
int sum =0;
while(*p != NULL)
{
sum += *p;
++p;
}
return sum;
}
int arry_sum2(int *p, size_t len)
{
int sum =0;
for(size_t i = 0 ; i < len ; ++i)
{
sum += p[i];
}
return sum;
}
int arry_sum3(int *pBegin, int * pEnd)
{
int sum = 0;
for(int * pIndex = pBegin; pIndex != pEnd ; ++ pIndex)
sum += *pIndex;
return sum;
}
int main(int argc, char* argv[])
{
int a[]={1,2,3,4,5,6,7,8,9,NULL};
cout<<arry_sum1(a)<<endl;
int b[] ={1,2,3,4,5,6,7,8,9};
cout<<arry_sum2(b,9)<<endl;
int *p1 =b;
int *p2 = b+9;
cout<<arry_sum3(p1,p2)<<endl;
return 0;
}
=====================================================================
另一种安全的方式是通过引用来使用数组
void fuck(int (&a)[10]);
当使用引用形参时,传递的是数组对象本身,此时编译器的类型检查会检查参数类型以及数组长度, 而不会忽略参数中的数组长度, 因而是安全的
相关文章推荐
- C++ | pair
- Essential C++学习笔记系列-第一章
- C++11中的std::function
- C++: 函数返回非引用类型与返回引用类型
- Sublime text 搭建C/C++环境
- C++ getchar()函数
- C语言函数指针的例子
- 9.26做题-队列安排
- C++输入cout与输出cin
- C++程序设计陷阱读书笔记(一)
- c++继承中的构造与析构
- 9.23/9.26强连通分量学习笔记
- 文章标题
- C语言解两个乒乓球队赛事问题
- 无法使用sort给vector排序
- More Effective C++ 条款25 将constructor和non-member function虚化
- c++ 日志类 线程安全+缓存
- C语言程序初体验-第十一课-第二题:分离浮点数的整数和小数
- C++中利用libxl操作Excel表格
- Python与C/C++ 代码互调