数组的宣言

数组的声明
1.
char (*ptr)[64] = new char[n][64];

2.
char **ptr = new char*[n];
for(int i = 0; i < n; ++i)
{
        ptr[i] = new char[64];
}

请教这两种方式的区别,从效率、空间、位置等各个方面谈谈,看看谁说得最透彻,谢谢。

顺便我还有三个帖子没有结,麻烦过去随便回复一下,我也好得一半的分。
------解决方案--------------------
1) ptr ---->【n】【64】      一个指针,n*64 个一次分配,空间  
                 栈上(或者全局变量区)一个指针的空间,(好吧也可能是堆上),
                +堆上  >n*64 个元素的空间
2)ptr---->【n】                              1+ n个指针 1 + n 次分配
             -->      ptr[0]--->【64】    
                         。。。。。。
                         ptr[i]---->【64】
                         。。。。。。。。 
                         ptr[n-1]---->【64】
                                                  
栈上1个指针 + 堆上 > n个指针 的空间 + > n*64 个元素的空间

小小的区别:
第一种方式,有利于分配大块内存,内存碎片少,
内存耗尽时,可以很简单的正常退出。

第二种方式,小块可分配内存多的时候更有利,占用内存略多一点。
但是内存碎片多,当内存耗尽的时候,
正常退出处理比较麻烦。

总的来说,区别不大。
差距很小