二维数组简介与使用方法_二维数组怎么写

二维数组简介与使用方法_二维数组怎么写前言本文将探讨一下关于二维数组在内存中的存储和二维数组在参数传递时的使用。一、二维数组在内存中的存储如果定义一个这样的二维数组inta[3][4]={{1,3,5,7},{9,11,13,15},{

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

前言

本文将探讨一下关于二维数组在内存中的存储和二维数组在参数传递时的使用。

一、二维数组在内存中的存储

如果定义一个这样的二维数组int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};则其在内存中的表示可能下面这样的。

二维数组简介与使用方法_二维数组怎么写

由上图可以看出,在内存中二维数组是按照行主序进行存储的,从内存的角度上看,二维数组本质就是一个一维数组。如果把二维数组的每一行看成一个整体,即看成一个数组中的一个元素,那么整个二维数组就是一个一维数组。而二维数组的名字代表二维数组第0行的首地址(注意它是代表一行元素的首地址,而不是第0行第0列元素的首地址,虽然是相等的,但不能这么理解,所以在没有强制转换的情况下,二维数据要么通过行指针进行参数传递,要么通过二维指针进行参数传递)

二、二维数组在参数传递时的使用

1、 可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小说明,如:

     void Func(int array[3][10]);

     void Func(int array[][10]);

     但是不能把第二维或者更高维的大小省略,如下面的定义是不合法的:

      如 void Func(int array[3][]);

 因为从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(行主序),而并不区分行和列,如果在形参中不说明列数,则系统无法决定应为多少行,多少列,不能只指定一维而不指定第二维。

2、将二维数组作为指针进行参数传递

(1)直接作为行指针(数组指针)来传递参数(二维数组的名字代表二维数组第0行的首地址

 1 #include "stdafx.h"
 2 #include<iostream>
 3 using namespace std;
 4 
 5 void test(int (*a)[4],int m,int n)
 6 {
 7     cout<<*(*(a+m)+n);
 8 }
 9 
10 int _tmain(int argc, _TCHAR* argv[])
11 {
12     int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
13     test(a,1,1);
14     return 0;
15 }

上述程序中int (*a)[4],可以理解为二维数组的行指针(这个指针指向二维数组的行,而每一行最多有4列),a[n]表示二维数组的第n行,所以cout<<*(*(a+m)+n);先定位出a数组的第m行的位置,然后再求出第m行第n列的值

(2)参数传递时将二维数组的强制转换为一维指针,然后按照内存中存储的方法计算二维数组对应成一维数组的下标

 1 #include "stdafx.h"
 2 #include<iostream>
 3 using namespace std;
 4 void test(int *a,int row,int column,int m,int n)
 5 {
 6     cout<<a[m*column+n];
 7 }
 8 
 9 int _tmain(int argc, _TCHAR* argv[])
10 {
11     int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
12     test((int*)a,3,4,1,1);
13     return 0;
14 }

注意参数传递时将二维数组的强制转换为一维指针,如上述程序中的第12行

 

注意:切不可将二维数组直接转换成二维指针作为形参传递,因为在这样子函数中不知道每一个一维元素含有多少个二维元素。

如,下面这样写就是错误的:

#include<iostream>
using namespace std;
void test(int **a,int m,int n)
{
    cout<<*(*(a+m)+n);
} 
int main()
{
     int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};

     test((int **)a,1,1);
     return 0;
 }

二维数组简介与使用方法_二维数组怎么写

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/168058.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • TextMate已激活成功教程

    TextMate已激活成功教程在pcbeta的帖子里找到了这个传说中的MAC杀手级武器的激活成功教程,针对的是1.5.8版本,摘抄如下:这个号称TheMissingEditorforMacOSX的编辑器我就不介绍了,我就说说如何注册吧。第一种方法:花39欧元第二种方法:UninstallfirstandInstalagain,justopentheTextMateunix(Apps

  • windbg使用详解_市场配置资源的基础是什么

    windbg使用详解_市场配置资源的基础是什么WinDbg配置和使用基础

  • 将SOP进行到底 (转载)

    将SOP进行到底 (转载)将SOP进行到底(转载)前段时期,为了强化公司中高层经理人员的“职业经理人”意识和提升大家的“职业经理人”能力,公司组织了中高层经理人员进行学习余世维先生“职业经理人”讲座的演讲交流活动,并组织相关经理人员参加了余世维先生在南京丁山香格里拉举行的“经理人常犯的11种错误”

  • 测试用例模板案例

    测试用例模板案例qq账号:用例编号 所属模块 用例标题 优先级 前置条件 输入数据 操作步骤 预期结果 实际结果 是否通过 测试人员 测试时间 qq_dl_001 登录 账号为六位自然数组成 高 输入账号和密码点击登录 账号:123456密码:abcd12 1:输入账号 2:输入密码 3:点击”登录” 1:账号被填充 2:密码被填充 3:登录成功,跳转主界面 1:账号被填充

  • 卷积神经网络(CNN)与深度卷积神经网络(DCNN)

    卷积神经网络(CNN)与深度卷积神经网络(DCNN)作为小白,看到DCNN,一直想知道与CNN的区别,也没找到明确的说法,以下是自己的一点想法,欢迎指正!目录一、CNN与DCNN二、基于pytorch的实现1.LeNet-52.AlexNet一、CNN与DCNN卷积神经网络,如:LeNet深度卷积神经网络,如:AlexNetAlexNet与LeNet结构类似,但使用了更多的卷积层和更大的参数空间来拟合大规模数据集ImageNet。卷积神经网络就是含卷积层的网络。AlexNet是浅层神经网络和深度神经网络的分界..

  • CTS测试介绍(面试怎么介绍接口测试)

    CTS测试基本介绍CTS测试全称为系列兼容测试(CompatibilityTestsuite),CTS是为了测试手机是否符合google定义的兼容性规范(CompatibilityDefinition)。从而基于Android的应用程序能在基于同一个api版本的设备上面运行。通过CTS测试的设备可以获得Android的商标,并且享受AndroidMarket的权限。CTS测试是一个基于…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号