一、 二维数组

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 \n", *( 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 \n", 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("\n");

  }

}

// 调用

print_1(a, 3);

// 打印数组内字符串

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

{

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

  {

    printf("%s\n", 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("\n");

}

// 指针数组

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("\n");

}

转载于:https://www.cnblogs.com/sylar-liang/p/4795648.html

C/C++ 指针数组、二维数组相关推荐

  1. 【C 语言】二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 将 一、二 模型数据拷贝到 三 模型中 并 排序 )

    文章目录 一.指针数组 和 二维数组 数据 拷贝到 自定义二级指针 中 1.函数形参 设计规则 2.三种内存模型 对应 函数形参 指针退化规则 二.完整代码示例 一.指针数组 和 二维数组 数据 拷贝 ...

  2. 【C 语言】二级指针作为输入 ( 二维数组 | 二维数组遍历 | 二维数组排序 )

    文章目录 一.二维数组 1.二维数组声明及初始化 2.二维数组遍历 3.二维数组排序 二.完整代码示例 一.二维数组 前几篇博客中 , 介绍的是指针数组 ; 指针数组 的 结构特征 是 , 数组中的每 ...

  3. 二级(多级)指针,二级指针和二维数组的避坑,指针面试考题

    1.二级指针的的认识 2.二级指针的实战 想获得二维数组的某个人的位置,采用的是return的方式 如果把第三行的int * 换成void ,把ppos换成传参的方式做. 结果崩溃了 原因是 是个野指 ...

  4. C语言指针和二维数组

    二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有"缝隙".以下面的二维数组 a 为例: int a[3][4] = { {0, 1, 2, ...

  5. C语言中的二级指针和二维数组问题

    关于二级指针和二维数组两者差别很大,不可以直接用二级指针传递二维数组 首先来看看二维数组在内存中是如何组织的呢? 一维数组 T arr1 = new T[9]  二维数组T arr2 = new T[ ...

  6. C语言学习之利用指针输出二维数组任一行任一列元素的值

    利用指针输出二维数组任一行任一列元素的值. int main(){int a[3][4];int i,j,x,y;int (*p)[4];//指针变量p指向包含4个整型元素的一维数组printf(&q ...

  7. c语言指针怎样代替二维数组,c语言 指针和二维数组

    // 指针和二维数组 #include int main(int argc, const char * argv[]) { int a[3][6]; for (int i=0; i<3; i++ ...

  8. C ++ 指针 | 指针与二维数组_5

    指针与二维数组 根据上面的图,我现在写一些语句,我们一起来判断输出值是多少!! int (*p)[3] = B; print B; 这个会打印多少? 思考一下....... ... ... ... 打 ...

  9. C++之指针探究(五):数组指针和二维数组

    前文:C++之指针探究(四):指针和二维数组 回顾:初始化二维数组时可以"偷懒":int array[2][3]={{0,1,2},{3,4,5}}; 可以写成:int array ...

  10. C++之指针探究(四):指针和二维数组

    前文:C++之指针探究(三):指针数组和数组指针 一. 二维数组 二维数组通常也被称为矩阵(matrix). 六种初始化方式:   (1) int a[3][4] = {1,2,3,4,5,6,7,8 ...

最新文章

  1. [tomcat]源码简析 异步/非阻塞和请求构成
  2. mysql 优化器关联查询_MySQL 查询优化器(二)
  3. 汤阳光 Hibernate笔记
  4. 【kotin】统计字符串中的字母数(拓展函数)
  5. Failed to update system registry. Need permission to add?
  6. 报 There is insufficient memory for the Java Runtime Environment to continue. 的问题
  7. 手机上有没有学python的软件-【Learn Python】用手机学Python
  8. 【miscellaneous】语音识别工具箱综述和产品介绍
  9. weak和assign的区别
  10. 散粉在哪个步骤用_新手化妆步骤+50个美妆小技巧+化妆知识扫盲
  11. mysql 存储session
  12. 关于.dll文件的注册,如何注册.dll文件
  13. 年会互动游戏有哪些?年会微信互动游戏制作流程是什么?
  14. 3.5 基本属性测试
  15. 在标准IO库中,rewind函数作用?
  16. ElementUI 图标字体无法正常显示 本地CDN文件
  17. PageAdmin如何修改后台页面标题。
  18. Gridea+Coding Page个人网站搭建
  19. 微服务-Nacos动态配置中心
  20. 龙族幻想导入数据id_龙族幻想:一键捏脸数据ID 快速捏脸数据ID汇总分享

热门文章

  1. ubuntu10.04添加账户示例
  2. u-boot移植随笔:终于解决Nor Flash的问题了
  3. Linux下载安装zookeeper
  4. 【Elasticsearch】Elasticsearch 集群健康值黄色 解决方案 或者 分片 未分配
  5. 【Elasticsearch】Elasticsearch 基于scoll技术滚动搜索大量数据
  6. 【elasticsearch】 elasticsearch document 路由 (routing) 到shard
  7. 【Spring】Spring 如何更改动态更改运行中某个类的日志级别
  8. Spring :@Configuration 注解
  9. 19-linux下ElasticSearch.6.2.1与head、Kibana、X-Pack、SQL、IK、PINYIN插件的配置安装
  10. vue面试有哪些插件_vue 前端框架面试问题汇总