C++之安全使用数组的4中方法

数组有两个特质:

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]);

 

当使用引用形参时,传递的是数组对象本身,此时编译器的类型检查会检查参数类型以及数组长度, 而不会忽略参数中的数组长度, 因而是安全的

 

更多关于编程语言, 数据库,算法等精品内容, 请访问  我的个人博客  huqijun.org

个人原创内容, 转载请注明来源!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值