CPP Primer 6.38研究记录 返回数组指针

int odd[] = {1,3,5,7,9};
int even[] = {0,2,4,6,8};
decltype(odd) *arrPtr(int i)
{
    return (i%2)?&odd:&even;
}

文中给出的例子是这个函数,以输入1返回odd为例子,这个函数的返回值指向的是odd的数组的指针,可以通过返回的指针解引用,得到数组头地址,再次解引用得到数组头的元素,或者用[]符号

    int (*tmp)[5] = arrPtr(1);
    cout<<"tmp:"<<tmp<<endl;
    cout<<"*tmp:"<<*tmp<<endl;
    cout<<"**tmp:"<<**tmp<<endl;
    cout<<"*tmp[0]:"<<*tmp[0]<<endl;

输出为:

tmp:0x403010 
*tmp:0x403010
**tmp:1      
*tmp[0]:1   

但要访问数组后面的元素对tmp进行自增是不行的

    cout<<"错误用法:"<<endl;
    cout<<"(*tmp[1]): "<<(*tmp[1])<<endl;
    cout<<"**(tmp+1): "<<**(tmp+1)<<endl;

输出为:

错误用法:     
(*tmp[1]): 0  
**(tmp+1): 0  

因为 tmp是 int(*)[5] 的类型,加一操作会让tmp的地址增加5个int大小,也就是增加了20,直接增到even的0位置去了,所以返回的0。

那么如何得到数组后续的元素呢?

    cout<<"正确用法:"<<endl;
    cout<<"(*tmp)[1]: "<<(*tmp)[1]<<endl;
    cout<<"*((*tmp)+1): "<<*((*tmp)+1)<<endl;

输出为:

正确用法:     
(*tmp)[1]: 3  
*((*tmp)+1): 3

或者将类型变成int *

    int* p = *tmp;
    for(int i = 0;i<5;++i)
    {
        cout<<*(p+i)<<endl;
    }

附 6.38修改函数

decltype(odd) &arrPtr1(int i)
{
    return (i%2)?odd:even;
}

//访问数组 引用是别名,每个引用对应了每个元素的地址,直接解引用即可
int (&p1)[5] = arrPtr1(1);
for(int i = 0;i<5;++i)
{
    cout<<*(p1+i)<<endl;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值