指针数组与指向指针的指针的区别: 指针数组声明的是数组,数组里放的是指针;而指向指针的指针声明的是指针,只是这指针指向另一个指针。 1.声明方式不同 普通数组声明方式是 int arr[10]; 声明一个数组元素都是int型值的数组 指针数组声明方式是 int* arr[10]; 声明一个数组元素都是int型指针的数组 数组中每一个元素都是一个指向int型值指针 普通指针声明 int* p; 声明一个指向int型值的指针 指向指针的指针声明 int** p; 声明一个指针 该指针指向的值是一个int型指针 2.访问时二者不同,指针数组是通过数组获得指针,再由获得的指针获得变量,如:b=*p[2]是把数组p第三个元素作为指针由*取其所指变量的值赋给b。而b=**p是把指针p指向的指针所指变量值赋给b。 3.指针数组至少有两个,常常是多个,可以用p++、p--获得下一个或上一个指针;而指针的指针只有1个,类似p++、p--的操作都是非法的。 4.指针数组可以用size操作符获取数组元素个数,指向指针的指针获得的则是指针长度。sizeof(arr) == 10, sizeof(p)==4. 指针数组的用法:
指针数组一般很少使用,最近在一个按键检测时偶尔使用,代码如下:
下面是一组x坐标信息,y坐标则是每一排都相等,所以y坐标可以共用,如果每个位置都用上下左右四个量表示,那么数据表则会庞大的多,而此方法用在数据量大的地方则可以大大节省制表所用的时间。
int _0[] = {20,60,110,160,210,260,310};//6列 7个位置
int _11[] = {10,60,110,160,215,270,320,370,425,475,530,580,635,685,740,790};//第一排17个按键 18个位置
int _21[] = {10,55,115,180,240,300,360,420,485,545,610,670,730,790};
int _31[] = {10,55,115,180,240,300,360,420,485,545,610,670,730,790};
int _41[] = {10,90,155,220,280,340,400,465,530,590,650,700,790};
int _51[] = {10,85,131,190,255,315,380,445,510,570,615,660,705,750,790};
int _61[] = {10,60,100,145,190,235,475,525,570,615,655,700,750,790};
int* _x1[] = {_11,_21,_31,_41,_51,_61};//int型指针的数组 数组中每一个元素都是一个int型指针
int _mun[] = { sizeof(_11)/sizeof(int), sizeof(_21)/sizeof(int), sizeof(_31)/sizeof(int),
sizeof(_41)/sizeof(int), sizeof(_51)/sizeof(int), sizeof(_61)/sizeof(int) };
通过两个for循环的嵌套就可以将上面六个数组遍历一遍
int i,j,k;
for(i=0;j=0k=0;k<sizeof(_x1)/sizeof(int);k++)
{
for(j=0;j<sizeof(_mun[k])/sizeof(int);j++,i++)
{
printf("%d,", _x1[l][j]);
}
printf("\n");
}
printf("allmun=%d\n",i);
ok,这样就将每一个x坐标都打印出来了。
指向指针的指针则用处更多,用法的差别就好比数组跟指针的差别。
上述表就可以也用指向指针的指针来做:
将上面的代码
int* _x1[] = {_11,_21,_31,_41,_51,_61};//int型指针的数组 数组中每一个元素都是一个int型指针
改成如下代码
int ** _x1 = new int*[6];
_x1[0] = _11;
_x1[1] = _21;
_x1[2] = _31;
_x1[3] = _41;
_x1[4] = _51;
_x1[5] = _61;
这样就ok了,后面的用法也是一样,只是在最后需要将指针变量删除,调用delete[] _x1就可以了。
很明显这样的用法并不是很方便,不如用数组指针方便。
指向指针的指针主要用在动态的申请,当我们编程时并不知道具体个数时,或者个数在不同情况下会不同时,这时候就不是数组指针能解决问题的了,而是必须使用指向指针的指针。
指向指针的指针对应于二维数组,可以称之为二维指针。
更复杂的数据有可能会用到三维四维指针,比如一个树形结构。
指向指针的指针还有一个明显的用处,当我需要调用一个函数帮我创建一块内存时,而这块内存的大小是在这个函数中获得的,此时就可以传入一个指向指针的指针。
好吧,我承认写的很乱。