C/C++ 指针数组、二维数组

一、 二维数组

1> 初始化

int a[3][3] = { {1,0,0}, {0,1,0}, {0,0,1} }; // 里面的括号是 {} , 而不是()

2> 将二维数组当做一维数组处理

// void Func(int array[3][10]) 相当于

// void Func(int array[][10]) 可变为

// void Func(int **array, int RowSize, int LineSize);

// *( (int *)array + i * LineSize + j ); 即把二维数组当作一维数组来处理

void print_array( int * p, int row, int line)

{

  for(int i=0; i<row; ++i)

  {

    for(int j=0; j<line; ++j)

    {

      printf("%d ", *( p + i * row + j ) ); // 相当于 *( *(p+i) + j ); // p[i][j]

      // cout << stew(3) << a[]

    }

  }

}

// 调用

print_array( (int *)a, 3, 3 );

3> 二维数组当二维数组使用

void WordSort(char p[][10], int row)
{
  char temp[10];
  for(int n=0; n<row; ++n)
  {
    for(int m=n+1; m<row; ++m)
    {

      // 冒泡排序
      if ( strcmp(p[m], p[n] ) < 0 )
      {
        strcpy(temp, p[n]);
        strcpy(p[n], p[m]);
        strcpy(p[m], temp);
      }
    }
  }

  for(int n=0; n<row; ++n)
  {
    printf("%s ", p[n]);

  }
}

// 调用

char p[5][10] = {"hello","world","111","135","134"};

WordSort(p, 5);

4> 行指针(二维数组作为形参的参数传递)

void print_1(int (*a)[3], int rowSize)

{

  for(int i=0; i<3*rowSize; ++i) // 这里3乘以rowSize,3代表每一行拥有的元素个数。

  {

    printf("%d ", (*a)[i]);

    if ( i%3 == 2)

      printf(" ");

  }

}

// 调用

print_1(a, 3);

// 打印数组内字符串

void print_string(char (*ptr)[20], int rowSize )

{

  for(int i=0; i<rowSize; ++i)

  {

    printf("%s ", ptr+i); // 这样写会有warning信息.

    // warning: format '%s' expects argument of type 'char*', but argument 2 has type 'char (*)[10]'

  }

}

// 调用

print_string(a, 6); // 其中a[6][20];

5> 动态分配二维数组行列大小

int m = 2; // 2行

int n = 3; // 3列

int **array = new int*[m]; // 分配行指针数组

for(int i=0; i<m; ++i)

{

  array[i] = new int[n]; // 为每一行分配空间

}

// 赋值

array[i][j] = xxx;

// 释放

for(int i=0; i<m; ++i)

{

  delete []array[i]; // 删除每一行分配的空间

}

delete []array; // 删除行指针数组

// 分配不等长的二维数组

int m = 3; // 行

int n[3] = {1,2,3}; // 每列的元素个数

int **array = new int*[m]; // 行指针数组

for(int i=0; i<m; ++i)

{

  array[i] = new int[ n[i] ]; // 每行分配不一样多的空间

}

// 赋值

for(int i=0; i<m; ++i)

  for(int j=0; j<n[i]; ++j)

    array[i][j] = xxx;

// 释放

for(int i=0; i<m; ++i)

  delete []array[i];

delete []array;

二、 指针数组

1> 区别

char *pc = new char(10); // 开辟一个字符空间,并初始化为10

// 相当于 char * pc = new char; *pc = 10;

// 释放

delete pc;

char *pca = new char[10]; // 开辟一个数组,可保存10个char元素

delete []pca;

2> 指针数组 与 数组指针 如何 指向 二维数组

int m[2][3] = { {1,0,0}, {0,1,0} };

int (*p)[3]; // 数组指针。 即行指针

int *q[3]; // 指针数组. 数组元素是指针,一共可存放3个int指针.

// 行指针(数组指针)

p = m; // p是行指针,可以直接指向二维数组.

// 输出

for(int i=0; i<2; ++i, ++p)

{

  printf("%d ", **p); // 每一行第一个元素

  printf("%d ", *(*p+1) ); // 每一行第二个元素

  printf("%d ", *(*p+2) ); // 每一行第三个元素

  printf(" ");

}

// 指针数组

int *q[3];

for(int i=0; i<2; ++i)

  q[i] = a[i]; // q是数组, q[i] 是指针。

// 输出

for(int i=0; i<2; ++i)

{

  for(int j=0; j<3; ++j)

  {

    printf("%d ", q[i][j]); // 或者下面输出

    //printf("%d ", *(q[i] + j) );

  }

  printf(" ");

}

原文地址:https://www.cnblogs.com/sylar-liang/p/4795648.html