在C++编程中,我们经常将数组作为参数传递到另一个函数,数组的维数不同,传递方式也不同,此处将作一个总结,包括一维静态、动态数组,二维静态、动态数组。

一,一维数组(静态、动态一维数组)

1, 一维数组寻址形式:num[i]的地址:num+i,因此一维数组作为参数传递时候,只需要用数组名作为参数即可。

  1. shuchu(num)
  2. void shuchu(int num[])

2,一维数组实例:

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void ces1(int *num)
  5. {
  6. for (int i = ; i < ; i++){
  7. cout << num[i] << endl;
  8. }
  9. }
  10.  
  11. void ces2(int *num, int m)
  12. {
  13. for (int i = ; i < m; i++){
  14. cout << num[i] << endl;
  15. }
  16. }
  17.  
  18. int main()
  19. {
  20. int num1[];
  21. for (int i = ; i < ; i++){
  22. num1[i] = i;
  23. }
  24. ces1(num1);
  25.  
  26. int k = ;
  27. int *num2 = new int[k];
  28. for (int i = ; i < k; i++){
  29. num2[i] = i + ;
  30. }
  31. ces2(num2, k);
  32. delete[] num2;
  33.  
  34. return ;
  35. }

二,二维数组

1,静态二维数组利用数组名和第二维大小作为参数

(1)二维数组如下int num[M][N],二维数组寻址形式:num[i][j]的地址:num+i*N+j。由此可知二维数组作为参数传递时候,除了数组名作为参数,还需要数组第二维的大小,第一维随意。

二维数组实参:

  1. shuchu(num);

二维数组形参二种形式皆可:

  1. void shuchu(num[][]);
  2. void shuchu(num[][]);

(2)二维数组实例:

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void ces(int num[][]) //这样可以
  5. //void ces(int num[][5]) //这样可以
  6. //void ces(int num[5][]) //这样不可以
  7. {
  8. for (int i = ; i < ; i++){
  9. for (int j = ; j < ; j++){
  10. cout<<num[i][j]<<" ";
  11. }
  12. cout<<endl;
  13. }
  14. }
  15.  
  16. int main()
  17. {
  18. int num[][];
  19. for (int i = ; i < ; i++){
  20. for (int j = ; j < ; j++){
  21. num[i][j] = i * j;
  22. }
  23. }
  24. ces(num);
  25. return ;
  26. }

2,动态二维数组利用二维指针传递数组参数

(1),我们知道动态二维数组的第一维和第二维都是变量,因此我们利用"数组名和二维大小作为形参"这种方式失效,此处必须利用二维指针。

二维数组实参:

  1. shuchu(num);

二维指针作为形参:

  1. void shuchu(int **num)

二维数组在子函数中使用方式:

  1. num[i][j]即可

3,静态二维数组也可用二维指针。

二维数组实参:

  1. shuchu((int **)num); //此处需要强制转化

二维指针作为形参:

  1. void shuchu(int **num)

二维数组在子函数中使用方式:

  1. 这样是不对的: num[i][j]
  2. 必须这样: *((int *)num+*i+j)
  3. ((int *)num+*i)[j]

4,下面给出了二维静态数组和动态数组的两个实例,有两处不同,在程序中用红色标识了

  1. //二维静态数组
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. void ces(int **num)
  6. {
  7. for (int i = ; i < ; i++){
  8. for (int j = ; j < ; j++){
  9. cout<<*((int *)num+*i+j)<<" "; //这样可以
  10. // cout<<((int *)num+5*i)[j]<<" "; //这样可以
  11. // cout<<num[i][j]<<" "; //这样不可以
  12. }
  13. cout<<endl;
  14. }
  15. }
  16.  
  17. int main()
  18. {
  19. int num[][];
  20. for (int i = ; i < ; i++){
  21. for (int j = ; j < ; j++){
  22. num[i][j] = i * j;
  23. }
  24. }
  25. ces((int **)num); //这样可以
  26. // ces(num); //这样不可以
  27. return ;
  28. }
  1. //二维动态数组
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. void ces(int **num, int m, int n)
  6. {
  7. for (int i = ; i < m; i++){
  8. for (int j = ; j < n; j++){
  9. // cout<<*((int *)num+5*i+j)<<" "; //这样不行
  10. // cout<<((int *)num+5*i)[j]<<" "; //这样不行
  11. cout<<num[i][j]<<" "; //这样可以
  12. }
  13. cout<<endl;
  14. }
  15. }
  16.  
  17. int main()
  18. {
  19. int m = , n = , i, j;
  20. int **num = new int*[m];
  21. for (i = ; i < m; i++)
  22. {
  23. num[i] = new int[n];
  24. }
  25. for (i = ; i < m; i++){
  26. for (j = ; j < n; j++){
  27. num[i][j] = i * j;
  28. }
  29. }
  30. ces(num, m, n); //这样可以
  31.  
  32. // ces((int **)num, m, n); //这样可以
  33. for (i = ; i < m; i++)
  34. {
  35. delete[] num[i];
  36. }
  37. delete[] num;
  38. return ;
  39. }

C++中将二维数组(静态的和动态的)作为函数的参数传递的更多相关文章

  1. C语言中将二维数组作为函数参数来传递

    c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下: 方法一, 形参给出第二维的长度. 例如: #include <stdio.h> void func(int n, char ...

  2. PHP中将二维数组 转换成字符串

    function arr_to_str($arr) { $t ='' ; foreach ($arr as $v) { $v = join(",",$v); // 可以用implo ...

  3. C语言 二维数组(指针)动态分配和释放(转)

    C 二维数组(指针)动态分配和释放 先明确下概念: 所谓32位处理器就是一次只能处理32位,也就是4个字节的数据,而64位处理器一次就能处理64位,即8个字节的数据.如果我们将总长128位的指令分别按 ...

  4. c 二维数组动态分配和释放

    c动态语言 函数声明的头文件在<stdlib.h>里 使用malloc函数为字符串分配内存 -->记得释放内存 free() #include <stdio.h> #in ...

  5. 【Java学习笔记之八】java二维数组及其多维数组的内存应用拓展延伸

    多维数组声明 数据类型[][] 数组名称; 数据类型[] 数组名称[]; 数据类型数组名称[][]; 以上三种语法在声明二维数组时的功能是等价的.同理,声明三维数组时需要三对中括号,中括号的位置可以在 ...

  6. 【Java学习笔记之九】java二维数组及其多维数组的内存应用拓展延伸

    多维数组声明 数据类型[][] 数组名称; 数据类型[] 数组名称[]; 数据类型数组名称[][]; 以上三种语法在声明二维数组时的功能是等价的.同理,声明三维数组时需要三对中括号,中括号的位置可以在 ...

  7. Java编程基础阶段笔记 day06 二维数组

    二维数组 笔记Notes 二维数组 二维数组声明 二维数组静态初始化与二位初始化 二维数组元素赋值与获取 二维数组遍历 二维数组内存解析 打印杨辉三角 Arrays工具类 数组中常见的异常 二维数组 ...

  8. C#学习笔记04--排序/查找/二维数组/交叉数组

    一. 冒泡排序(重点) 思路:  每次比较把较小的放在前面, 大的放到后面; 图解:下图是最坏情况下的排序 ` 冒泡排序m个元素, 就有(m-1)趟排序, 第一趟m-1次, 第二趟 m-2次....  ...

  9. 二维数组及Arrays工具类

    1.二维数组 概念: 数组中的每一个元素类型都是一维数组 二维数组初始化方式: 静态初始化: 格式: 元素类型[][] 数组名 = new 元素类型[][]{{一维数组1},{一维数组2},{一维数组 ...

随机推荐

  1. Codeforces Recycling Bottles 模拟

    C. Recycling Bottles time limit per test: 2 seconds memory limit per test: 256 megabytes input: stan ...

  2. 学美工、平面设计、UI设计,哪个有前途?

    首先,在分析学美工.平面设计.UI设计,哪一个更有前途的时候,先要对三类设计有一个大概的了解. 比如“学美工.平面设计.UI设计是什么”等知识,才能更好地去进行选择. 01 阐述美工.平面设计.UI设 ...

  3. JDK 泛型之 Type

    JDK 泛型之 Type 一.Type 接口 JDK 1.5 引入 Type,主要是为了泛型,没有泛型的之前,只有所谓的原始类型.此时,所有的原始类型都通过字节码文件类 Class 类进行抽象.Cla ...

  4. Java 8 Optional 类深度解析

    Java 8 Optional 类深度解析 身为一名Java程序员,大家可能都有这样的经历:调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法.我们首先要判断这个返回值是否为null,只 ...

  5. php连接mssql

    首先修改php.ini,将下行的前的分号去掉. extension=php_mssql.dll 由于本机没有安装客户端,所以要将ntwdblib.dll复制到C:\WINDOWS\system32目录 ...

  6. 第二篇博客 wordcount

    1.首先 附上Github项目地址:https://github.com/June1104/WordCount 2.psp表格 PSP2.1表格 PSP2.1 PSP阶段 预估耗时 (分钟) 实际耗时 ...

  7. C++之类和对象的特性

    简介:C++并不是一个纯粹的面向对象的语言,而是一种基于过程和面向对象的混合型的语言. 凡是以类对象为基本构成单位的程序称为基于对象的程序,再加上抽象.封装.继承和多态就成为面向对象程序. 1.掌握类 ...

  8. SPSS-相关性和回归分析(一元线性方程)案例解析

    任何事物和人都不是以个体存在的,它们都被复杂的关系链所围绕着,具有一定的相关性,也会具备一定的因果关系,(比如:父母和子女,不仅具备相关性,而且还具备因果关系,因为有了父亲和母亲,才有了儿子或女儿), ...

  9. SSH:Struts + Spring + Hibernate 轻量级Java EE企业框架

    Java EE(Java Platform,Enterprise Edition)是sun公司(2009年4月20日甲骨文将其收购)推出的企业级应用程序版本.这个版本以前称为 J2EE.能够帮助我们开 ...

  10. (线段树) I Hate It --hdu--1754 (入门)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1754 这次的代码和上个代码很相似,只不过上次的节点里存的是sum值,这次节点里存放的是Max, 正在慢慢 ...