C++ 指针数组 与 数组指针,数组引用,返回数组指针/数组引用/指针数组的函数,

最近从头刷了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()

返回指针数组的函数

因为数组本身就可以转化为指针,数组的数据类型又为指针, 所以可以理解为直接返回指针的指针**就ok了。
int *a[10];
int **func( );
{
	return a;
}
这个是我自己根据上面几种情况联想到的,C++ primer没提到过,也不知道这种情况是否有意义。

你可能感兴趣的:(C++,C++)