直接上代码吧,解释说得很清楚了。

// C++Primer.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <iostream>
using namespace std;
int (*function(int i))[10];//返回数组指针的函数

int main()
{
	cout<<"数组、指针数组、数组指针、返回数组指针的函数:"<<endl<<endl;
	int arr[10]; //声明一个数组,数组元素是int
	int *p1[10];//声明一个数组,数组元素是指向int的指针
	int (*p2)[10];//声明一个指向含有10个整形的数组,p2本身是个指针
	for(int i = 0; i < 10; i++)
		arr[i] = i;
	for(int i = 0; i < 10; i++)
		cout<<arr[i]<<" ";
	cout<<endl<<"arr:"<<arr<<endl;//输出首地址
	cout<<"&arr[0]:"<<&arr[0]<<endl;//输出首元素的地址
	cout<<"*arr:"<<*arr<<endl;//输出首地址指向元素的值,也就是首元素的值
	cout<<"*(arr+1):"<<*(arr+1)<<endl<<endl;//通过对指针的加法输出元素值
	cout<<"对p1赋值为arr元素的地址并输出:"<<endl;
	for(int i = 0; i < 10; i++)//也可以是&arr[i]
		p1[i] = arr+i;
	for(int i = 0; i < 10; i++)
		cout<<p1[i]<<" ";
	cout<<"通过对p1中的元素解引用输出数组arr:"<<endl;
	for(int i = 0; i < 10; i++)//p1中存储的都是地址
		cout<<*p1[i]<<" ";
	cout<<"对指向数组的指针p2赋值为arr的地址:"<<endl;
	p2 = &arr;//对指针赋值,p2存储的是arr的地址
	cout<<"p2:"<<p2<<"      "<<"*p2:"<<*p2<<endl;//为什么会相同?
	cout<<"p2[i]:"<<endl;
	for(int i = 0; i < 10; i++)//这个访问时无意义的,因为越界了。p2[i]编译器解释为*(p2+i)
		cout<<p2[i]<<" ";      //而p2只是个地址,没有意义,它后面接的元素不是数组,跟p2没有关系
	cout<<"*p2[i]:"<<endl;
	for(int i = 0; i < 10; i++)
		cout<<*p2[i]<<" ";//同上,对上述的地址解引用而已,已经越界访问,没有意义
	cout<<"(*p2)[i]:"<<endl;
	for(int i = 0; i < 10; i++)
		cout<<(*p2)[i]<<" ";//等同于arr[i]
	return 0;
}



贴上结果:

数组、指针数组、数组指针、返回数组指针的函数的关系_数组