直接上代码吧,解释说得很清楚了。
// 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;
}
贴上结果: