最近从头刷了C++ primer一遍,遇到数组指针、指针数组、数组引用、返回数组指针/数组引用/指针数组的函数这块,有点乱,遂整理一番。比较基础的东西但也容易弄混。
指针数组:
通常定义形式: int *a[10] ,或者写成这样更清晰: int* (a[10])
本质上它是一个数组,数据类型为int*指针。
使用:
int i=123, *pi=&i;
a[0]=&i; a[1]=pi;
数组指针:
定义形式: int (*pa)[10]
本质上是一个指针,指向一个维度为10的数组。
使用:
int a[10] , aa[5][10];
int (*pa)[10] ;
int (*paa)[10];
pa=&a ; pa是指向维度为10的数组的指针, 所以对数组a取地址。
paa=aa; pa是指向维度为10的数组的指针,而aa是一个二维数组, 可以理解aa[5] 指向了一个维度为10的数组,所以paa=aa
for(int i=0;i<10; i++)
{
(*pa)[ i ] = i;
上面不可以直接使用 pa【i】=i ; 因为pa是指针,指向的内容才是数组(虽然数组也可以看成是指针,但暂且不把数组看成是指针。
解引用 (*pa)得到数组a, (*pa)[i]使用数组的成员。
}
for(int i=0;i<5;i++)
for(int k=0;k<10;k++)
{
paa[i][k]=123456;
(*(paa+i))[k]=123456;
*(*(paa+i)+k)=123456;
以上三处等价。
}
数组引用:
int &a[10] 等价 int& (a[10]) ......错误! 不存在引用数组。
int a[10]
int (&ra)[10] =a ; a是一个引用,引用对象为维度为10的数组。必须初始化。
按由内而外的顺序阅读,&ra代表ra是一个引用, (&ra)[10] 代表ra引用一个维度为10的数组, int (&ra)[10]ra引用一个维度为10的int型数组
使用:
for(int i=0;i<10;i++)
ra[i]=i; 等价于a[i]=i;
int aa[5][10];
int (&raa)=aa[2]; 把raa与aa【2】绑定,
for(int i=0;i<10;i++)
raa[i]=i; 等价于aa[2][i]=i;
返回数组指针的函数:
直接定义:
int a[10] , int (*pa)[10];
int (*func() )[10] //跟定义一个数组指针很类似 int (*pa)[10] ,把pa换成func()
使用尾置返回类型的定义:
auto func( ) -> int (*)[10]
使用decltype:
decltype(a) *func() ; //这里decltype不会把数组转化为指针
decltype(pa) func();
使用别名:
typedef int arrT[10] // using arrT=int[10]
arrT *func()
返回数组引用的函数:
与返回数组指针的函数很是类似。把*换成&即可。
直接定义:
int a[10] , int (&ra)[10]=a;
int (&func() )[10]
使用尾置返回类型的定义:
auto func( ) -> int (&)[10]
使用decltype:
decltype(a) &func() ; //这里decltype不会把数组转化为指针
decltype(ra) func();
使用别名:
typedef int arrT[10] // using arrT=int[10]
arrT &func()