//------------------------------------------不同形式的数组指针的区别 ---------------------------------
1、int** ptr;//声明指向“一群”
指向整数指针的指针。可以理解成ptr[N][N]。(N表示若干,以下同)
2、int* ptr[5];//声明5个指向整数指针的指针,即ptr有
5个指向"一群"整数的指针。可以理解成ptr[5][N]。
3、int (* ptr)[5];//声明
指向"一群"指向 5 个整数数组的指针的指针。 可以理解成ptr[N][5]。
针对1,
因为是指针的指针,需要两次内存分配才能使用其最终内容。
首 先,ptr = ( int ** )new int *[5];
这样分配好了以后,它和(2)的意义相同了;然后要分别对 5 个指针进行内存分配,例如: p
tr[0] = new int[20];
针对2,上面已经说过,ptr[0] = new int[20]。
针对3,这个不好理解,
它的意义是"一群" 指针,每个指针都是指向一个 5 个整数的数组。
如果想分配N个指针,这样写: ptr = ( int ( * )[ 5 ] ) new int[ 5*N]。这样p
tr[0] 指向第 0 个 5 个整数数组的首地址,ptr[1] 指向第1个5个整数数组的首地址。
//------------------------------------------二维数组的创建 ---------------------------------
class A;
.......
A * ptr1 = new A[num];
//动态声明一维数组
A **ptr2;
//动态声明二维数组
ptr2 = new A*[row]
//申请row个指针,每个指针属于A*,即可指向一群A,待分配==21
for( int i = 0 ; i < row; ++i)
ptr2[i] = new A[vol];
//对每个指针进行动态分配,每个指针指向vol个A对象==2
//------------------------------------------二维数组的删除 ---------------------------------
二维数组的删除与申请的步骤刚好相反。
for( int i = 0 ; i < row ; ++ i)
delete [] ptr2[i];
//删除每行的对象,对应上面的==2
delete [] ptr2;
//删除row个指针,对应上面的==1