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

二维数组简介与使用方法_二维数组怎么写前言本文将探讨一下关于二维数组在内存中的存储和二维数组在参数传递时的使用。一、二维数组在内存中的存储如果定义一个这样的二维数组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;
 }

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

 

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 清除挖矿脚本 minerd[通俗易懂]

    清除挖矿脚本 minerd[通俗易懂]症状:cup占用率飙高原因:这次入侵是由于redis没有设置用户名密码,没有限制访问ip导致 解决方法:ps-eopcpu,args–sort=%cpu|head  找到飙高的程序是minerdTOP查看minerd的pidkill-s9pid(pid的值每个服务器不同)rm-rf /var/spool/cron/cronta

    2022年7月13日
    15
  • 强大的 IDEA 代码生成器,学会用,真香!

    强大的 IDEA 代码生成器,学会用,真香!

    2020年11月13日
    281
  • 分享67套基于Java开发的Java毕业设计实战项目(含源码+毕业论文)【新星计划】

    分享67套基于Java开发的Java毕业设计实战项目(含源码+毕业论文)【新星计划】【新星计划】分享67套基于Java开发的Java毕业设计实战项目(含源码+毕业论文)基于Java开发的Java毕业设计实战项目本文中的所有主题都来自互联网。如果您侵犯您的权利,请及时联系Blogger,博主将及时处理。投诉邮箱:1919101926@qq.com(没事勿扰,不接单,也没时间解决难题,谢谢配合)。文章目录->建议收藏关注+点赞<-基于Java开发的Java毕业设计实战项目前言Java毕业设计所用到的开发环境Java毕业设计项目简单介绍17套基于Java开发的[互

    2022年9月1日
    2
  • centos7重启apache、nginx、mysql、php-fpm命令

    centos7重启apache、nginx、mysql、php-fpm命令

    2021年10月19日
    40
  • GridView用法,分页

    GridView用法,分页一.基础部分分页:只有用SqlDataSource作为数据源的时候才有在用ObjectDataSource的时候需要另外写代码另外该控件的“排序”和“分页”都打勾的时候,先进行整体排序,再分页;当启用

    2022年7月1日
    16
  • java定时任务quartz配置_taskregistrar

    java定时任务quartz配置_taskregistrar这篇文章主要介绍了spring中定时任务taskScheduler的相关资料,文中通过示例代码介绍的很详细,相信对大家具有一定的参考价值,有需要的朋友们下面来一起看看吧。前言众所周知在spring3.0版本后,自带了一个定时任务工具,而且使用简单方便,不用配置文件,可以动态改变执行状态。也可以使用cron表达式设置定时任务。被执行的类要实现Runnable接口TaskScheduler接口Tas…

    2022年10月11日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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