new创建多维数组有关问题。请

new创建多维数组问题。请高手指点!
我在看一些C++方面的教材时,一些书上这样写到:
      用New操作可以创建多维数组,new   类型名   T[下标表达式1][下表表达式2]...。数组的个数是除最左边一位外各位下表表达式的乘积。如:float   (*p)[25][10];
                                                                                                    p=new   float[10][25][10];用new操作产生了一个指向25*10的二维数组的指针;
      在这里。我有些地方搞不懂,请大家指点:
  1:为什么数组的个数是除最左边外各位的下标表达式的乘机?如上面,明明是创建了[10][25][10]呀,怎么会是25*10个数组元素.搞不懂!!!
  2:上面的指针的方式也有些看不懂,请大家帮忙解释一下.谢谢!
  2:在一些论坛上我看到要动态分配一二维数组可以用以下方法:
  int       **p       =       new       int*[5];      
    for(int       i=0;i <5;i++)      
                    p[i]       =       new       int[10];      
        既然可以用上面讲的直接创建二维数组,为何还要有上面的方法?搞不清楚。请各位大侠耐心指点。。。谢谢!!!!


------解决方案--------------------
1:为什么数组的个数是除最左边外各位的下标表达式的乘机?如上面,明明是创建了[10][25][10]呀,怎么会是25*10个数组元素.搞不懂!!!


这是因为,你定义的这个数组的指向是25*10个元素的数组,而这个数组有10个,这个个数是由你的指针偏移量来决定的,并不是数组的个数.

换个简单点的看的清楚
int a[2][10];
int (*p)[10]=a;
这是说p指向一个具有10个元素的数组,而这个p有两个偏移,也就是说,p可以向下再移一位,实际上相当于一个二维数组.


2:上面的指针的方式也有些看不懂,请大家帮忙解释一下.谢谢!


上面的指针方式就和我刚才举的那个例子差不多,相当于int (*p)[10]= new int[2][10];这样子.也就是p可以指向具有10个元素为列元素的二维数组


3:在一些论坛上我看到要动态分配一二维数组可以用以下方法:
int **p = new int*[5];
for(int i=0;i <5;i++)
p[i] = new int[10];
既然可以用上面讲的直接创建二维数组,为何还要有上面的方法?


上面讲的的确可以直接创建二维数组,但是那是静态创建的,是在栈上生成.
而很多时候我们需要在堆上生成的这种数组,也就是动态数组,所以必须要用new来分配
------解决方案--------------------
这个问题应该是50分的题,是很好的题目

1:为什么数组的个数是除最左边外各位的下标表达式的乘机?如上面,明明是创建了[10][25][10]呀,怎么会是25*10个数组元素.搞不懂!!!
========================================
用new操作产生了一个指向25*10的二维数组的指针,说是指向25*10个元素了吗?
总分配10*25*10个元素也是没错的

扩充:正如我们用点指针*p来指向线(a[]),我们用行指针(*p)[]来指向面a[][]
我们同样用面指针(*p)[][]来指向三维空间a[][][]
这就是我们几何中的由点到面由面到体在语言中的展现!
指针的偏移就是它对应对象的另一个维数!!