什么是数组指针?什么又是指针数组?他们二者有啥区别?
这灵魂三连问往往让刚学指针的同学陷入无限的懵逼,别急!这次咱们就来彻底理清楚
指针数组
教大家一个方法,不管他的名字有多复杂,看最后俩个字就可以,比如说指针数组,最后俩个字是数组,这就说明他的本质就是数组,前面的词语都是修饰词。比如在指针数组中,指针是修饰词,只是想告诉我们首先这是一个数组,其次数组中的元素是指针,仅此而已。表现形式是int *p[4];根据运算符的优先级,P先和【4】结合,于是p【4】组成了一个4个元素的数组,然后在和*结合,说明了数组中的4个元素都是地址,也就是指针啦。给大家举个例子,函数指针数组这是个什么东东啊?通过前面的方法,我们只看后俩个字,前面的都是修饰词,后俩个字是数组,所以他的本质还是数组。通过前面的修饰词指针我们可以知道,数组中的元素是地址,在通过修饰词函数我们可以知道他的地址是函数名,综上所述函数指针数组是数组,数组中的元素是函数名。
总结:不管是指针数组还是函数指针数组,本质都是数组,只不过数组里面的元素不一样罢了,普通的数组里面的元素是int 型的,或者是char 字符型的,亦或者是double 浮点型的,这些大家都非常熟悉了,指针数组里面的类型是地址而已。比如int * p[3]={&a,&b,&c}.
放一段代码加深大家的理解
int main()
{
int a,b,c,d;
a=10,b=20,c=30,d=10;
int *p[4]={&a,&b,&c,&d};
for(int i=0;i<4;i++)
printf("%d ",*p[i]);
return 0;
}
数组指针
继续用我们的方法,看最后俩个字。最后俩个字是指针,好的那么他的本质就是指针。那么这个指针指向什么数据类型呢?前面的修饰词告诉了我们答案,对,他指向的是就是数组。例如:int (* p)[4];这次为什么在给*p加了括号呢?因为优先级的关系,【】的优先级比 星号优先级高,如果不加括号,p就先和【】结合,再和 星号结合,这不就成了指针数组了吗?所以为了避免这种情况,我们加了括号。int (*p)[4]首先表示这是一个指针,具体点他是一个指向含有4个元素数组的指针。这4个元素其实就是二维数组的列,代表每行有4列。所以数组指针也可以称其为行指针。
总结:数组指针本质就是指针,是指针就必须指向一个数据对象,要不然就成野指针了,那么数组指针,指针指向的对象就是数组。【】里面的数字代表二维数组有几列。
当一段代码加深大家的理解
int main()
{
int a[2][2]={1,2,3,4};
int (*p)[2]=a;
printf("第一个元素:%d\n",**p);
printf("第二个元素:%d\n",*(*p+1));
printf("第三个元素:%d\n",**(p+1));
printf("第四个元素:%d\n",*(*(p+1)+1));
}