做行业门户网站注意什么,佛山做网站优化,网页排版设计模板,提供搜索引擎优化公司概括的说#xff0c;指针其实就是可变数组的首地址#xff0c;说是可变数组#xff0c;是 指其包含内容的数量的可变的#xff0c;并且是可动态申请和释放的#xff0c;从而充 分节约宝贵的内存资源。我一向喜欢一维数组#xff0c;除非万不得已#xff0c;我一 般是不用…概括的说指针其实就是可变数组的首地址说是可变数组是 指其包含内容的数量的可变的并且是可动态申请和释放的从而充 分节约宝贵的内存资源。我一向喜欢一维数组除非万不得已我一 般是不用二维数组的多维的则更是很少涉足了。因为一维简单容 易理解而用指针指向的多维数组就具有相当的复杂性了也因此更 具有讨论的必要。 闲话少说这里我就以三个二维数组的比较来展开讨论 (1)、int **Ptr; (2)、int *Ptr[ 5 ]; (3)、int ( *Ptr )[ 5 ]; 以上三例都是整数的二维数组都可以用形如 Ptr[ 1 ][ 1 ] 的 方式访问其内容但它们的差别却是很大的。下面我从四个方面对它们 进行讨论 一、内容 它们本身都是指针它们的最终内容都是整数。注意我这里说 的是最终内容而不是中间内容比如你写 Ptr[ 0 ]对于三者来说 其内容都是一个整数指针即 int *Ptr[ 1 ][ 1 ] 这样的形式才 是其最终内容。 二、意义 (1)、int **Ptr 表示指向一群指向整数的指针的指针。 (2)、int *Ptr[ 5 ] 表示指向 5 个指向整数的指针的指针。 (3)、int ( *Ptr )[ 5 ] 表示指向一群指向 5 个整数数 组的指针的指针。 三、所占空间 (1)、int **Ptr 和 (3)、int ( *Ptr )[ 5 ] 一样在32位平 台里都是4字节即一个指针。 但 (2)、int *Ptr[ 5 ] 不同它是 5 个指针它占5 * 4 20 个字节的内存空间。 四、用法 (1)、int **Ptr 因为是指针的指针需要两次内存分配才能使用其最终内容。首 先Ptr ( int ** )new int *[ 5 ]这样分配好了以后它和(2)的 意义相同了然后要分别对 5 个指针进行内存分配例如 Ptr[ 0 ] new int[ 20 ]; 它表示为第 0 个指针分配 20 个整数分配好以后 Ptr[ 0 ] 为指 向 20 个整数的数组。这时可以使用下标用法 Ptr[ 0 ][ 0 ] 到 Ptr[ 0 ][ 19 ] 了。 如果没有第一次内存分配该 Ptr 是个野指针是不能使用 的如果没有第二次内存分配则 Ptr[ 0 ] 等也是个野指针也 是不能用的。当然用它指向某个已经定义的地址则是允许的那是另外 的用法类似于借鸡生蛋的做法这里不作讨论下同。 (2)、int *Ptr[ 5 ] 这样定义的话编译器已经为它分配了 5 个指针的空间这相当 于(1)中的第一次内存分配。根据对(1)的讨论可知显然要对其进行一次 内存分配的。否则就是野指针。 (3)、int ( *Ptr )[ 5 ] 这种定义我觉得很费解不是不懂而是觉得理解起来特别吃力 也许是我不太习惯这样的定义吧。怎么描述它呢它的意义是一群 指针每个指针都是指向一个 5 个整数的数组。如果想分配 k 个指针 这样写 Ptr ( int ( * )[ 5 ] ) new int[ sizeof( int ) * 5 * k ]。 这是一次性的内存分配。分配好以后Ptr 指向一片连续的地址空间 其中 Ptr[ 0 ] 指向第 0 个 5 个整数数组的首地址Ptr[ 1 ] 指向第 1 个 5 个整数数组的首地址。 综上所述我觉得可以这样理解它们 int ** Ptr int Ptr[ x ][ y ]; int *Ptr[ 5 ] int Ptr[ 5 ][ x ]; int ( *Ptr )[ 5 ] int Ptr[ x ][ 5 ]; 这里 x 和 y 是表示若干的意思。