free website counter

C++ 数组初始化

数组初始化

  之前对C++的数组,特别是二维数组初始化,就有点混乱,每次有问题,上网查一下,回头还是一样的状态。前段时间刷Leetcod,做Palindrome Partitioning时,顺便查资料做了一个总结,方便以后查阅。

1. int **ptr 声明指向一群指向整数指针的指针,作类比,即指向地址ptr[N][N],不知这样类比是否合适?

  • 由于是指针的指针,所以需要两次分配内存才能最终使用。
  • 第一次分配内存: int *ptr = new int[5],即5个指向N个指针的指针,此时与2等价。
  • 第二次分配内存: 循环体内,ptr[i] = new int[N],分别对5个指针分配内存。
  • 释放内存操作: 循环体内delete [] ptr[i],删除每行的对象,结束循环后, delete [] ptr,释放第一次分配的N个指针内存。
  • 函数参数传递: 函数参数传递时,实参直接用ptr,形参用int **f指针。

2. int* ptr[5] 声明5个指向整数指针的指针,作类比,即指向地址ptr[5][N]

  • 分配内存直接按1中第二次分配内存的方式。这种声明方式不能用一个变量len代替5的位置,在编译阶段变量并没有值,无法开辟空间。
  • 内存释放操作与1中一样。

3. int (*ptr)[5] 声明指向一群指向5个整数数组的指针,作类比,即指向ptr[N][5]

  • 如果想分配N个指针内存空间,ptr = (int ()[5]) new int[5N],则ptr[i]指向第i个5个整数数组的首地址。

4. 直接将二维数组作为参数传递,数组定义:int a[n][n] = {0}

  • 由于编译器寻址为p+i*n+j, 故不能省略第二维的大小,这种情况下n一定要是确定值,不能使用变量
  • 形参:int **a
  • 实参:(int**)a
  • 函数内对数组寻址:((int)array + n*i + j)
Published 08 October 2014
分享按钮