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

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

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

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

  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;

 

2、sizeof与指针数组、数组指针

(1)short *p1[100];  

   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;

转载于:https://www.cnblogs.com/dpflnevergiveup/p/3279150.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值