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

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

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

shuchu(num)
void shuchu(int num[])

2,一维数组实例:

#include <iostream>
using namespace std; void ces1(int *num)
{
for (int i = ; i < ; i++){
cout << num[i] << endl;
}
} void ces2(int *num, int m)
{
for (int i = ; i < m; i++){
cout << num[i] << endl;
}
} int main()
{
int num1[];
for (int i = ; i < ; i++){
num1[i] = i;
}
ces1(num1); int k = ;
int *num2 = new int[k];
for (int i = ; i < k; i++){
num2[i] = i + ;
}
ces2(num2, k);
delete[] num2; return ;
}

二,二维数组

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

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

二维数组实参:

shuchu(num);

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

void shuchu(num[][]);
void shuchu(num[][]);

(2)二维数组实例:

#include <iostream>
using namespace std; void ces(int num[][]) //这样可以
//void ces(int num[][5]) //这样可以
//void ces(int num[5][]) //这样不可以
{
for (int i = ; i < ; i++){
for (int j = ; j < ; j++){
cout<<num[i][j]<<" ";
}
cout<<endl;
}
} int main()
{
int num[][];
for (int i = ; i < ; i++){
for (int j = ; j < ; j++){
num[i][j] = i * j;
}
}
ces(num);
return ;
}

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

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

二维数组实参:

shuchu(num);

二维指针作为形参:

void shuchu(int **num)

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

num[i][j]即可

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

二维数组实参:

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

二维指针作为形参:

void shuchu(int **num)

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

这样是不对的:  num[i][j]
必须这样: *((int *)num+*i+j) 或
((int *)num+*i)[j]

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

//二维静态数组
#include <iostream>
using namespace std; void ces(int **num)
{
for (int i = ; i < ; i++){
for (int j = ; j < ; j++){
cout<<*((int *)num+*i+j)<<" "; //这样可以
// cout<<((int *)num+5*i)[j]<<" "; //这样可以
// cout<<num[i][j]<<" "; //这样不可以
}
cout<<endl;
}
} int main()
{
int num[][];
for (int i = ; i < ; i++){
for (int j = ; j < ; j++){
num[i][j] = i * j;
}
}
ces((int **)num); //这样可以
// ces(num); //这样不可以
return ;
}
//二维动态数组
#include <iostream>
using namespace std; void ces(int **num, int m, int n)
{
for (int i = ; i < m; i++){
for (int j = ; j < n; j++){
// cout<<*((int *)num+5*i+j)<<" "; //这样不行
// cout<<((int *)num+5*i)[j]<<" "; //这样不行
cout<<num[i][j]<<" "; //这样可以
}
cout<<endl;
}
} int main()
{
int m = , n = , i, j;
int **num = new int*[m];
for (i = ; i < m; i++)
{
num[i] = new int[n];
}
for (i = ; i < m; i++){
for (j = ; j < n; j++){
num[i][j] = i * j;
}
}
ces(num, m, n); //这样可以 // ces((int **)num, m, n); //这样可以
for (i = ; i < m; i++)
{
delete[] num[i];
}
delete[] num;
return ;
}

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. maven的pom.xml样例

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  2. geoserver的rest服务介绍,搭建java程序

    在geoserver中使用 Restlet 来提供所有的rest服务,并且geoserver中所有的在/rest目录下的请求都被看作为一个restful server,下图就是rest服务的调用过程 ...

  3. html 5 如何限制上传的文件类型 (uploadifive)

    可以直接设置input标签的accept属性来限制上传文件的类型 <input type="file" accept="application/msword&quo ...

  4. Vue.js 2.0 跨域请求数据

    Vuejs由1.0更新到了2.0版本.HTTP请求官方也从推荐使用Vue-Resoure变为了 axios .接下来我们来简单地用axios进行一下异步请求.(阅读本文作者默认读者具有使用npm命令的 ...

  5. fms +fme 视频直播

    1.安装fms 按默认安装即可 2.安装fme 安装完成后启动fme FMS URL是发布到fms的地址默认就可以, 然后点击 Connect 连接成功后左下角会出现connected的提示, 然后点 ...

  6. 简明PR教程

    注意:本文供培训使用且仅为第一版 作者也不打算继续更新 本篇文章最早是在为内部培训时所编写的文章 有些疏漏且没有进行校正等工作 我尽力用最简单通俗的语言给大家介绍PR的使用方法 简明PR教程 1.编辑 ...

  7. java--多线程编程简介

    1.什么时候使用多线程编程 一个任务在正常情况下是按顺序执行的,但是如果当前任务里有多个相似进程块(例如for,while语句),我们就可以考虑把这些代码块抽出来并行运行,无需阻塞 2.实现多线程的几 ...

  8. Part 6 - Class-Based Views(21-26)

    https://github.com/sibtc/django-beginners-guide/tree/v0.6-lw urlpatterns = [ views.PostUpdateView.as ...

  9. 【redis】linux上的安装与配置(详细图解)

    转载自:https://blog.csdn.net/yjqyyjw/article/details/73293455:经过个人测试也适用于当前最新稳定的3.x的版本,顺便填了几个坑. 1.下载 htt ...

  10. vivado用法

    声明为”DEBUG”,即使没有连接到其他模块,也不会被优化掉.但并不是所有的信号都是在声明为“debug”属性之后就不会优化掉. (2)同一个bank中能设置一个电平. (3)