指针数组与指向指针的指针有什么区别
他们的区别是:指针数组,表示的是一个由指针变量组成的数组也就是说其中的元素都是指针变量,而数组指针表示的是这是个指向数组的指针。
那么该指针变量存储的地址就必须是数组的首地址得是个指向行的地址,比如a[3][4]数组中的 a,a+2 等,不能是具体的指向列的地址,如 &a{2][1], &a[2][1] 这类地址。
指针数组:
指针数组可以说成指针的数组,这个变量是一个数组。其次指针修饰这个数组,意思是说这个数组的所有元素都是指针类型,在 32 位系统中指针占四个字节。
数组指针:
数组指针可以说成是数组的指针.这个变量是一个指针。其次数组修饰这个指针,意思是说这个指针存放着一个数组的首地址,或者说这个指针指向一个数组的首地址。
根据上面的解释可以了解到指针数组和数组指针的区别,因为二者根本就是种类型的变量。
指针数组:表示的是一个数组,数组中每一个变量都是指针型变量。数组指针:表示的是一个指针类型的变量,这个指针变量指向的是一个数组。
数组指针的本质就是一个指向数组地址的指针。所占内存空间大小为4char(*p),这里的p指向一个含有4个char类型的数组。
假设char a[4]={'a','b','c','d'},数组的地址和数组中首元素的地址相同,a+1是在数组移动一个元素的长度,移动距离为1,而p+1是是移动一个数组的长度,移动距离为4。
关于二维数组和指针的关系,二维数组的本质是一个二维指针,例如 char a[2][3] ,char **p=a,*p(i)+j 是指向元素p[i][j]的地址,等同于a[i]+j,*(*p(i)+j)表示a[i][j]元素,等同于*p[i][j],*p(i)是指向数组第i行的地址,*p是表示二维数组的地址。
打比方来说:
一个城市(内存)都是小房子(内存单元),每个房子都有门牌号(内存单元的地址)。
快递员送货时按照门牌号给大家送货(数据)。
如果你到亲戚家去了,货物要送到你手上,你必须在你家的房子上留一张纸条(指针),上面写着你亲戚家的门牌号;于是快递员先到你家取到你留的纸条,根据纸条找到你亲戚家,然后把货送给你。
指针数组就是连续一条街道上的房子主人各自都留了纸条等待送货员取用。
数组指针就是一条街道的第一个房子的门牌号。
总之,指针数组是元素全部都是指针类型的数组,本质是数组;
数组指针是指一个指向数组元素的指针,本质是指针
指针数组存储了多个内存地址,而数组指针则是第一个元素的内存地址
数组指针:a pointer to an array,即指向数组的指针
还要注意的是他们用法的区别,下面举例说明。
int* a[4] 指针数组
表示:数组a中的元素都为int型指针
元素表示:*a[i] *(a[i])是一样的,因为[]优先级高于*
int (*a)[4] 数组指针
表示:指向数组a的指针
元素表示:(*a)[i]