C/C++中有两个很easy混淆的十分经常使用的可是又特别不引起人注意的两个概念,指针数组和数组指针,也许你已经对这两个概念早有耳闻,可是不知你有没有对他们做过仔细的分析来差别二者呢?


    以下我们来看下百度百科上是怎样对二者进行定义的


    数组指针


  一:数组指针:数组名本身就是一个指针,指向数组的首地址。注意这是声明定长数组时,其数组名指向的数组首地址是常量。而声明数组并使某个指针指向其值指向某个数组的地址(不一定是首地址),指针取值能够改变。

  二:数组指针:是指向数组的一个指针,如int (*p)[10] 表示一个指向10个int元素的数组的一个针。   

   

    指针数组


    一个数组,若其元素均为指针类型数据,称为指针数组。 也就是说,指针数组中每个元素都相当于一个指针变量。其具体形式应该例如以下: *a[0], ...*a[n]. 每个数组里面存储的是其指向的地址;一维指针数组的定义形式为:类型名 *数组名[数组长度]

比如:int *p[4],因为[]比*优先级更高,因此p先与[4]结合,形成p[4]的形式,这显然是数组形式。然后再与p前面的*结合,*表示此数组是指针类型的,每一个数组元素都指向一个整型变量。

 

    demo:

    从上面的对照分析中我们能够清楚的知道二者的差别,关键就在于*和[]优先级上的问题,以下通过一个样例来分析一下。

 

声明 char *ponitArray[] = {"stately" , "plump" , "buck" , "mulligan"}; 由定义知这是一个指针数组,那么sizeof(pointArray)=?呢,由于pointArray是一个存放指针的数组,而存放指针事实上存放的是地址,一般用4个字节表示,而数组大小为4,故而结果就为4*4 = 16.

 

char (*arrayPoint)[4];
char t[4]="123";
arrayPoint=&t;
cout<<"*A = "<<*arrayPoint<<"\tA = "<<arrayPoint<<endl;


上面几行代码输出结果应该是什么呢?,首先arrayPoint是一个指针,指向一个存放4个字符的C风格字符串,从这里我们能够知道arrayPoint事实上是一个32位(一般)的整数,全部下一步我们要将一个长度为4的字符串地址赋给该指针,即arrayPoint=&t;,故可知输出结果就为“123”和字符串t的地址。