zoukankan      html  css  js  c++  java
  • 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(" ");

    }

  • 相关阅读:
    艾伟_转载:把事件当作对象进行传递 狼人:
    艾伟_转载:AOP in Asp.net MVC 狼人:
    艾伟_转载:基于.NET平台的Windows编程实战(一)——前言 狼人:
    艾伟_转载:闲说继承 狼人:
    艾伟_转载:面向对象封装了啥 狼人:
    艾伟_转载:LINQ to SQL、NHibernate比较(二) LINQ to SQL实例 狼人:
    艾伟_转载:我对NHibernate的感受(1):对延迟加载方式的误解 狼人:
    艾伟_转载:用C#编程合并多个WORD文档 狼人:
    艾伟_转载:基于.NET平台的Windows编程实战(二)—— 需求分析与数据库设计 狼人:
    艾伟_转载:从ASP.NET的PHP执行速度比较谈起 狼人:
  • 原文地址:https://www.cnblogs.com/sylar-liang/p/4795648.html
Copyright © 2011-2022 走看看