有人问我二三维指针的事,讲了一大堆,总结了以下代码:

void TestPointer()
{
        // 优先级 [] 高于 *,()高于[]
        int i,j,k;
        // 指针和数组
        // 看是指针还是数组要看他的名字(不带[]也不带*)能否直接对其进行内存分配
        // 因为数组是确定的分配好内存地址的,而指针则是用于指向地址的
        // 所以为指针分配内存或赋值时,应该理解为指向数组地址或其他地址

        // 读法:由低优先级向高优先级读
        // *Array0[10]:指针——数组
        // int **Array1[2]:指针——指针——数组(二维指针数组)
        // *(*pPointer4)[2]:指针——数组——指针(指向指针数组的指针)
        // (*pPointer3)[30][20]:数组——数组——指针(指向二维数组的指针)

        // 1、数组和指针数组 
        int Array[10];    // Array是数组,有10个元素,元素的类型是int型
        int *Array0[10];    // Array0是指针数组,有10个元素,元素的类型是int型指针
        for( i=0; i<10; i++ )
        {
                Array0 = new int[i+1];    // Array0是int型的指针
                delete[] Array0;
        }
        int **Array1[2];    // 一个指向指针的指针的数组(二维指针数组),拥有两个元素
        // 每一个元素都是int ** 型(指向指针的指针) ,但 Array1 终究也是个数组,
        Array1[0]=new int *[10];    // int *[10]为指针数组,见下面一条
        Array1[1]=new int *[10];
        delete [] Array1[0];
        delete [] Array1[1];

        // 2、指向数组的指针
        int *pPointer0=new int[10];    // pPointer0是指针,赋值号右边但申请的是一个数组,只不过用指针指向它

        // 指向“指针数组”的“指向指针的指针”
        // 定义一个数组,有10个元素,元素的类型是int*
        // 用指向指针的指针指向该指针数组, pPointer1[]表示数组中的每个元素(int *)
        // 为指针数组中每个元素申请空间,并为申请到的空间中的元素赋值
        int **pPointer1=new int*[10];
        for( i=0; i<10; i++ )
        {
                // *(pPointer1+i) = new int[i+1]; 也可
                pPointer1 = new int[i+1];
                for( j=0; j<i+1; j++ )
                {
                        // *(*(pPointer1+i)+j) = 1;
                        pPointer1[j] = 1;
                }
                delete[] pPointer1;
        }
        delete [] pPointer1;

        // 指向二维数组的指针,
        // 该二维数组最低维数的元素数量为8个,类型为int
        int (*pPointer2)[8];
        // 理解 (*pPointer2)[8]:
        // (*pPointer2)说明它是一个指针,
        // (*pPointer2)[8]说明p2一次跳过8个元素,
        //         即pPointer2指向一个二维数组,且最低维为8,该数组元素不是指针
        pPointer2= new int[10][8];
        for( i=0; i<10; i++ )
        {
                for( j=0; j<8; j++ )
                {
                        pPointer2[j] = 20;
                }
        }
        delete []pPointer2;  // 删除(释放)二维数组


        // 指向三维数组的指针,该三维数组低两维的元素数量为[30],[20],类型为int
        int (*pPointer3)[30][20];    // 这个数组低两维必须是确定的
        pPointer3=new int[1][30][20];
        delete []pPointer3;  //删除(释放)三维数组


        // 指向二维指针数组的指针
        // 声明一个3*2的二维数组,元素是指针,
        // 用一个指针的指针pPointer4指向该数组首地址
        // pPointer4[j]是该二维数组的每个元素,(i<=3 j<=2)
        int *(*pPointer4)[2] = new int *[3][2];
        // 对*(*pPointer4)[2]的理解:
        // (*pPointer4)说明pPointer4是指针,
        // (*pPointer4)[2]说明这个指针写成pPointer4时,一次跳两个元素,即pPointer4指向的数组最低维=2
        // *(*pPointer4)[2]说明每个元素都是指针
        for( i=0; i<3; i++ )
        {
                for( j=0; j<2; j++ )
                {
                        pPointer4[j] = new int [5];
                        for( k=0; k<5; k++ )
                        {
                                pPointer4[j][k] = 5;
                        }
                        delete[] pPointer4[j];
                }
        }
        delete[] pPointer4;
}