int (*p)[4]等同于int *p[4]吗?

答:不等同。

int *p[4]是一个指针数组,就是数组里面放的是指针。由于[]比*优先级更高,因此p先与[4]结合,形成p[4]形式,这显然是数组形式,它有4个元素,然后再与p前面的*结合,*表示此数组是指针类型的,每个数组元素(也就是一个指针变量)都可以指向一个整形变量。

*p[4]是指针数组,他是数组。数组里面放的是指针,简单的说定义了4个指针,分别是*p[0] *p[1] *p[2] *p[3],相当于将这四个指针打包到这个数组中

(*p)[4]是数组指针,他是指针并且是一个指向一维数组的指针。因为以行为单位,又称行指针。 通俗点讲,后面的[4]说明他的每行有4个元素,[0]代表第一列的下标,[1]代表第二列的下标,一次类推。(*p)的意思是指针p指向第一行,*(p+1)即指向第二行,同理一次类推。那么*(p+2)[3]的意思即是指一维数组第二行第四列的元素
 
实例:
 void main()
{
	int a[3][4] ={1,3,5,7,9,11,13,15,17,19,21,23};
	int (*p)[4],i,j;
	p = a;
	scanf("i = %d,j = %d",&i,&j);
	printf("%d",*(*(p+i)+j));
	
}
输入i=1,j=2
结果:13
 
分析
int (*p)[4]表示p是一个指针变量,它指向包含4个整形元素的一维数组。注意*p两侧的()不可缺少。
对照下列:
(1)int a[4];(a有4个元素,每个元素为整形)‘
(2)int (*p)[4](p所指的对象是有4个整形元素的数组,即p是一维数组的指针,应该记住此时p只能指向一个包含4个元素的一维数组,p的值是该一维数组的起始地址。)
p->| (*p)[0] | (*p)[1] | (*p)[2] | (*p)[3] | 
p->| 1 | 3 | 5 | 7 |
p+1->| 9 | 11 | 13 | 15 |
p+2->| 17 | 19 | 21 | 23 |
其中p+i是二维数组的a的i行的起始地址(由于p是指一维数组的指针变量,因此p加1,就指向下一行),那么*(p+2)+3是什么呢?由于p=a,因此*(p+2)就是a[2],*(p+2)+3就是a[2]+3,而a[2]的值是数组a中第3行第0列a[2][0]那么*(*(p+2)+3)就是a[2][3]
另外*(p+2)是a数组第3行的首地址,而p+2是a数组第3行的起始地址,二者值相同,那*(p+2)+3能否写成(p+2)+3呢?显然不成,不能做简单的数值替换。(p+2)+3就成了p+5了,是a数组第6行的起始地址。
要注意"*(p+2)+3"括号中的2以一维数组的长度为单位的,即p每加1,地址就增加8个字节(4*2个字节),而"*(p+2)+3"括号外面的3,不是以p所指向的一维数组位长度为单位的。3是以元素的长度为单位的,加3就是加(3x2)个字节。虽然p+2和*(p+2)具有相同的值,但是它们所指向的对象的长度是不同的。

-------------------------------------------------------------------------------------------------
这是一个数组指针,指向对象是这个数组; 
示例:
static int m[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};/* 定义二维数组m并初始化*/
    int (*p)[4];//数组指针  p是指针,指向一维数组,每个一维数组有4个int元素
    int i,j;
    p=m;    //p是指针,可以直接指向二维数组
    printf("--数组指针输出元素--\n");
    for(i=0;i<3;i++)/*输出二维数组中各个元素的数值*/
    {
        for(j=0;j<4;j++)
        {
            printf("%3d ",*(*(p+i)+j));
        }
        printf("\n");
    } 


  • 9
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值