关于“指针数组”和”数组指针“

  我一直弄不清楚”指针数组“和”数组指针“的区别,最近这段时间看到了一些关于数组和指针的关联和区别的资料,而后总结了下这两个概念的区别,以备后续查看。编程

一、区分指针数组和数组指针数组

  short *ptr[10];   //指针数组,可理解为:存放指针数组spa

  short (*ptr1)[10];  //数组指针,可理解为:指向数组指针指针

  ptr为指针数组,能够这么看(short *) ptr[10],即ptr首先是长度为10的数组,其类型为(short *)型,或者说该数组的元素类型是指针类型;内存

  ptr1是数组指针,能够这么看(short [10]) *ptr1,即ptr1首先是指针,该指针指向的是长度为10的shor型数组,或者说该指针存储的是长度为10的short型数组的地址,能够以下初始化ptr1:引用

  short a[10];方法

  ptr1 = &a;总结

 

二、sizeof与指针数组、数组指针时间

(1)short *p1[100];  co

   sizeof(p1) = 400;

   sizeof(p1[0]) = 4;

   sizeof(*p1) = 4;

   sizeof(*p1[0]) = 2;

分析:这里p1为指针数组,根据上述分析p1的元素类型是short *

   sizeof(p1[0]) = sizeof(*p1) = 4(注:任意指针的sizeof大小均为4);

   *p1[0] 为short型,sizeof(*p1[0]) = sizeof(short) = 2 ;

   故,sizeof(p1) = 100 *sizeof(short *) =100 *  4 = 400;

(2)short (*p2)[100];

  sizeof(p2) = 4;

  sizeof(p2[0]) = 200;

  sizeof(*p2[0]) = 2;

  sizeof(*p2) =  4;

分析:p2是数组指针,根据上面的分析p2为指针,至关于以下定义:short p2[][100];

   因此,sizeof(p2) = 4,sizeof(*p2) =  4;

   p2[0] = short [100],sizeof(p2[0]) = 100 * sizeof(short) = 100 * 2 =200;

   *p2[0] = p2[0][0],因此有:sizeof(*p2[0]) = sizeof(short) = 2;

(3)short (*p3[5])[3];

  sizeof(p3) = 20;

  sizeof(p3[0]) = 4;

  sizeof(*p3) =  4;

  sizeof(*p3[0]) = 6;

  sizeof((*p3[0])[0]) = 2;

分析:关于声明从名字开始读,而后按照优先级顺序读取(详细方法见《C专家编程》第三章P65)

   这里p3是指针数组,该数组有5个元素,每一个元素都是一个指针,每一个指针都指向一个含有3个元素的数组;

   因此,sizeof(p3) =  5 * sizeof(short *) =  5 * 4 = 20;

   p3[0]仍然是指针,指向数组short [3],sizeof(p3[0]) = sizeof(short *) = 4;sizeof(*p3) =  4;

   *p3[0] 至关于指针p3[0]的解引用,指向第一个数组的起始地址,因此sizeof(*p3[0])至关于求第一个数组的内存大小:sizeof(*p3[0]) = sizeof(short [3]) = 3 * sizeof(short) = 6;

   (*p3[0])[0] 至关于数组的第一个元素,至关于*p[0][0]因此sizeof((*p3[0])[0]) = sizeof(short) =2;注意:p3[0][0]也是一个指针,指向数组的第一个元素。sizeof(p3[0][0]) = 6;

相关文章
相关标签/搜索