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;
}