指针和数组基本等价的原因在于指针算术和C++内部处理数组的方式。 ——《C++PrimerPlus》第五版
在多数情况下,C++将数组名解释为数组中第一个元素的地址。
int arr[10] = {1,2,3,4,5};
int *p = arr;
cout<<" -------------- 3 种方式得到数组的地址 ------------------- "<<endl;
cout<<"arr -> "<<arr<<endl;
cout<<"&arr[0] -> "<<&arr[0]<<endl;
cout<<"p -> "<<p<<endl;
cout<<" -------------- 4 种方式得到数组的值 ------------------- "<<endl;
cout<<"arr[1] -> "<<arr[1]<<endl;
cout<<"*(arr+1) -> "<<*(arr+1)<<endl;
cout<<"*(p+1) -> "<<*(p+1)<<endl;
cout<<"p[1] -> "<<p[1]<<endl;

总结:
arrayname[i] 等价于 *(arrayname+i)
这部分参考微博:http://www.cnblogs.com/Romi/archive/2012/01/10/2317898.html
指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针
数组指针:a pointer to an array,即指向数组的指针
还要注意的是他们用法的区别,下面举例说明。
int* a[4] 指针数组
表示:数组a[4]是指针,指针的类型是int*,指针的指向类型是int
元素表示:*a[i] *(a[i])是一样的,因为[]优先级高于*
int (*a)[4] 数组指针
表示:a是指针的类型是int*[4], 指针的指向的类型为int()[4]
元素表示:(*a)[i]
#include<bits/stdc++.h>
using namespace std;
int main()
{
/*** 指针数组
** <数组 pstr[3],数组的元素是指针> 三省指针:指针的类型是 int * ,指向的类型是int ,数组内每个指针分别指向 三个字符串的首地址
***/
char *pstr[3] = {
"Socialism",
"with",
"Chinese"
};
cout<<" pstr[0] "<<pstr[0][0]<<endl;;
cout<<" pstr[1] "<<pstr[1]<<endl;;
cout<<" pstr[2] "<<pstr[2]<<endl;;
/*** 数组指针
** <指针 pstr1> 三省指针:指针的类型是 int (*)[20] ,指向的类型是int()[20] ,指针指向 str1
***/
char str1[20] = "Characteristics";
char (*pstr1)[20] = &str1;
//b=&str1;
cout<<" *pstr1 "<<*pstr1<<endl;;
}

注意:字符串相当于一个数组常量,内容不可改变,且只能为右值,如果看成指针,即是常量指针也是指针常量
指针常量:该指针是一个常量,不可改变,指向某一个地址就不能改变,但是0指向的单元是可以改变的,一般读做常量指向
常量指针:指针的值不能改变,但是自身是一个变量,读作指向常量
数组名是数组的首地址
a)含义:
声明一个数组 : TYPE arrayname[N];
有两层含义:1.arrayname是一个数组,类型是TYPE[N]
2.array是一个常量指针,指针的类型是TYPE *,指向类型是TYPE,指向的值是数组的第0号元素,注意arrayname和数组第0号元素的地址是不同的,arrayname是指针常量,arrayname++是错误的。
b)功能
| sizeof(arrayname) | arrayname代表的是数组本身,得到的是整个数组的大小 |
| *arrayname (等同 arrayname[0]) | arrayname代表的是指针,得到的是数组第0号元素的值 |
| arrayname+i | arrayname代表的是指针,得到的是指针向后偏移i个指向类型的单位的指针 |
补充:sizeof(对象)测出的都是对象自身的类型大小
原文:http://www.cnblogs.com/sxy-798013203/p/7754858.html