int (*p)[4]和 int a[4]; int *p=a;有本质区别么, int (*p)[4]如何初始化

作者&投稿:包孟 (若有异议请与网页底部的电邮联系)
区分一下int* p[4]和int (*p)[4]
前者代表p是一个数组,里面装的是int*型的指针;
后者相反,p是一个指针,指向一个int[4]的数组。

所以归根结底,这里p是一个指针。那么,我的理解是,*p打印出来是这个int[4]的首地址,而不是这个数组里面的值。而且,p+1的话,地址相当于以int[4]为单位增加,而不是以int为单位增加。

而,int *p=a这个例子,*p打印出来是a[0]里的值,故而两者应当是不同的。

如果是int* p[4], p=a的话,就会出现数组p的首地址变成数组a的首地址。而p[0] 就会变成a[0]的值,但是此时p[0]的类型为int* ,而a[0]为int,这时如果dereference这个p[0]的话,就会出现segementation fault.

归根结底,无论int* p[4]还是int (*p)[4],都相当于二级指针,与a[4]这种一级指针肯定是不同的。

至于初始化,比较伤
&p是p自己的地址,已经不用管了,p是个地址,需要你来给出,*p也是地址,这个也需要你给出,**p才是数值。
指针这种东西,其实就没什么所谓的初始化,一开始都设为NULL,只有当确定有相对应的内存空间之后,才能去取地址使用。

比如有a[2][4],这个时候,p = &a[0][0]或许是可以的,但是p+2的时候,就不能保证是取到是什么数值了。

总之,就记成,指向int[4]的一个指针就好了,而int[4]是个数组类型(自己定义的),凡是数组,其实都是一串地址。

~