在c++中使用指向数组的引用

转自:http://www.cnblogs.com/yonken/archive/2011/05/04/Using_Reference_To_Fixed_Size_Array.html

今天在工作中需要在一个把一个class内部的某个数组成员expose(是的,有时候不这样做只是徒增麻烦)给外面使用,于是自然而然就想应该是返回一个指向这个数组的引用会好些。指向数组的引用这种用法虽然不是很多见,但我还是写过不少次了,为了方便我常常会用typedef数组类型来实现,不过今天我突然想到一个问题,typedef 只是为了缩短敲的代码长度和阅读方便(当然有时候反而造成麻烦,但这不是重点),也就是说必然会有不需要 typedef 的写法,那么如果要写一个函数让它返回一个指向数组的引用呢?究竟怎么写呢?这个问题我还真搞不定,还好google帮了我。

1. 声明一个指向数组的引用

刚开始接触这个问题的时候确实是有点懵,不过看了C++ Primer后发现这个其实很简单:

int  n3[3] = {2, 4, 6};
int  (&rn3)[3] = n3;     // A reference to an array of 3 ints

没错,确实是有那么点怪异!

那么,typedef 一下也许就好理解多了:

int  n3[3] = {2, 4, 6};
typedef  int  Int3[3];
Int3& rn3 = n3;             // A reference to an array of 3 ints

2. 定义一个接受数组的引用作为其参数的函数

先看看指针是怎么写的:

void  GetInt3_Example1( int * pn3)
{
     pn3[2] = 1; // access the third element
}

不过,谁能保证 pn3 的大小就一定是3个int呢?再试试看:

void  GetInt3_Example2( int  n3[3])
{
     n3[2] = 1;  // access the third element
}

当然这样只不过是让它看起来正确罢了, 实际上这种写法和第一种没啥区别!试试看:

int  loc[2]; // local array of 2 integers
GetInt3_Example2(loc);  // no compile error, but access violation!

果然是不行的有木有!

这里还要注意的是,如果改用typedef,会出现一个需要注意的问题:

void  GetInt3_Example3(Int3 n3)
{
     Int3 loc    = {0};
     int  n3Size  = sizeof (n3);   // n3Size == 4
     int  locSize = sizeof (loc);  // locSize == 12, see?
}

所以说,最终还是要用引用才能达到限制大小的目的:

void  GetInt3_Example4( int  (&n3)[3])

 或者还是用 typedef 让它看起来舒服些?

void  GetInt3_Example5(Int3& n3)

3. 返回一个指向数组的引用

好了,终于到重点,先来看看用typedef是怎么写的:

Int3& GetInt3_Example6()
{
     static  int  n3[3] = {2, 3, 1};
     return  n3;
}

很好,那么如果说不用typedef呢?

好吧,我不得不google之,按照这个博客的解释,原来又是一个怪异的写法:

int  (&GetInt3_Example7()) [3]
{
     static  int  n3[3] = {2, 3, 1};
     return  n3;
}

真是会让人晕倒啊有木有!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值