二维数组知多少

有的实际问题一维数组是无法解决的,所以引入二维数组甚至是多维数组,这里着重讨论一下二维数组,如果深刻理解二维数组多维数组也就迎刃而解。

1. 二维数组的定义:例如现在有3支球队,每支队有5个人,要充分表达每个人便可以引入二维数组,例如a[0][0]就表示第一支队伍的第一个人。这里的a便是数组名,第一个[0]表示第一支队伍,第二个[0]表示第一支队伍里的第一个人。根据此类比喻可以根据条件要求将二维数组扩展为多维数组。

2. 二维数组在内存中布局:我们可以把二维数组的布局想象成表格,第一行表格便是第一行一维数组,但是事实上二维数组在内存中的布局并不是这样的,因为内存不是表状的,而是线形状的。相当于一把尺子,变量在内存中开辟的值便从尺子的高地址处依次向第地址出排布的,那么二维数组的存储也符合这样的规则,从较高地址处排布a[0][0]直到较低地址处排布a[3][5],直到整个数组存储完毕。二维数组在内存中存储遵循最右边下标率先变化的规则,例如int *p; p=a[0][0]; ++p; 那么++p是谁的地址呢?根据上述规则的++p应该是*a[0][1]。对于[][]里面的下标可以认为第一个为行,也可以认为它表示列,这些没有严格的限制,只要遵循上下文的逻辑意思,同时不改变它的实际存储方式即可。

3. 二维数组名:首先我们知道数组名就是数组首元素的地址,所以a便是&a[0],又因为a[0]是第一行的一维数组,它也是一个数组名,它也代表该一维数组首元素的地址,a[0]=&(一维数组第一个元素)。所以说,可以把二维数组理解为一个二级指针便不难理解。a+1便让二维数组偏移到了第二行的以为数组,它等同于(&a[0]+1),(&a[0]+1)表示是指向第二行一维数组的指针,所以*(&a[0]+1)便的到第二行一维数组的名字,即*(a+1)也是第二行一维数组的名字,即a[1],*(*(a+1)+1)便是a[1][1]的值。

4. 二维数组的初始化:二维数组初始化有两种方式,第一种是给出长长的初始值列表例如int a[2][2]={1,2,3,4};第二种方式是int a[2][2]={1,2},使用包含2个复杂元素的一维数组。

5.  指向二维数组的指针,如果有int a[5]; int *p=a,这是正确的,p是一个指向整型的指针,并且把它初始化指向数组a的第一个元素。对于二维数组int a[2][2]; int *p=a,是不对的,因为p是一个指向整型的变量,它并没有能力指向一个数组,所以应该这样写:int a[2][2]; int (*p)[2]=a; p是一个指向拥有2个整型元素的数组的指针,也就是一个数组指针变量,初始化为a。

6.  函数参数中二维数组用法:和一维数组相同,二维数组名实际传过去的是指向数组第一个元素的指针,因为二维数组中每个元素又是一个一维数组,所以编译器需要知道它的位数。在一维数组中我们知道,函数的形参原型有两种书写方式,例如:void(int *p)或void(int p[])。这里我们可以进行模仿 例如:void(int (*p)[2])或者void(int p[][2]),第一个表示一个指针数组,它有能力指向有两个元素的一维数组,所以这样接收实参不会有问题;第二种表示第二种是一种数组的形式接收形参,其实和一维数组同理,它还是接收的是数组的地址。这两种方式都同时要注意第一维的写法可以变化,但是第二维的数字绝对都能省略,因为只有知道它才能对各下标进行求值运算。

对于二维数组在函数中的实参:实参直接用数组名即可

时间: 2024-10-11 03:26:40

二维数组知多少的相关文章

编程题:指向二维数组元素的指针变量。功能:已知二维数组a[2][3],输入输出全部元素。

#include<stdio.h> void main() { int a[2][3],i,j; int *p; /*用坐标法输入二维数组元素*/ for(i=0;i<2;i++) for(j=0;j<3;j++) scanf("%d",&a[i][j]); /*用指针法输出二维数组元素*/ p=a[0];         /*等价于p&a[0][0];*/ for(;p<a[0]+6;p++)   printf("%4d&quo

求一个已知二维数组的最大子数组和(司宇,廖强)

小组成员:司宇,廖强 设计流程:          设计界面:               程序设计:1.封装一个求二维整数组最大子数组和的子程序: 2.设计一个主函数,主函数可以调用子函数: 3.在主函数中添加代码,使主函数可以调用一个TXT文件并且得到要求的结果. 遇到的问题:1.在调用txt文件时,没办法使调用文件前两行分别显示行数和列数: 2.在调用子函数的时候,不知道应该赋值给子函数一个什么类型的参数: 3.如何将String类型的二维数组转化为int类型. 解决方案:(当我们遇到问题

数组指针与二维数组的寻址

引例:已知如下程序 1 #include <stdio.h> 2 main() 3 { 4 int x[3][4] = {1,3,5,7,9,11,2,4,6,8,10,12} ; 5 int (*p)[4] = x, k = 1, m, n = 0; 6 for(m=0; m < 2; m++) 7 n += *(*(p+m)+k); 8 printf("%d\n",n); 9 } 试写出程序的输出值.(虽然我很讨厌做这种笔头功夫的题,我也坚信编程语言是在实践中练出

1.二维数组计算班级成绩

import java.util.Scanner; /** * 已知有3个班级各5名学员,请使用二维数组计算各个班级的总成绩 * */ public class ThreeTotal { public static void main(String[] args) { Scanner input=new Scanner(System.in); int [][] array = new int[3][5]; //3个班的成绩 //i:班级 j:各班级的学生 for(int i=0;i<array.

java数组(一维数组,二维数组)

数组初始化: 1,动态初始化:数组定义与为数组分配空间和赋值的操作分开进行 2,静态初始化:在定义数组的同时就为数组元素分配空间并赋值 3,默认初始化:数组是引用类型,它的元素相当于类的成员变量,因此,数组分配空间之后 每个元素也被按照成员的规则被隐士的初始化值 ------------------------------------------------. 一维数组: package day06; import java.util.Date; /*** * 数组演示 * 数组的声明: * t

JAVA的 一维数组、二维数组、三维数组、多维数组等。

这个数组可以看做新手学习,从一维数组 到 多维 数组 循环渐进,其实看起也很简单,一看便知,众所周知,一维.二维或许经常用到,用到二维以上应该就很少了. public class test { public static void main(String[] args) { /*一维数组*/ int num[] = {0,1,2}; /*下面输出 3 行数据,0 ~ 2*/ for (int i = 0; i < num.length; i++) { System.out.println("

【转载】二维数组的动态分配和参数传递

本篇随笔为转载,原贴地址:http://www.cnblogs.com/bigshow/archive/2009/01/03/1367661.html. 1. C语言动态分配二维数组 (1)已知第二维 Code-1 char (*a)[N];//指向数组的指针 a = (char (*)[N])malloc(sizeof(char *) * m); printf("%d\n", sizeof(a));//4,指针 printf("%d\n", sizeof(a[0]

二维数组、多维数组

二维数组: 定义二维数组 int[,] myArray = new int[几个一维数组,数组中的个数]; 数组可以具有多个维度.例如,下列声明创建一个四行两列的二维数组(可以理解为4个1维数组,数组中包含2个元素): int[,] myArray = new int[4,2]; int[,] myArray = new  int[4,2] {{1,2}, {3,4}, {5,6}, {7,8}}; 取值则是 Int i=myArray[0,0] 输出结果i为:1 Int i=myArray[0

环二维数组问题

题目: 输入一个二维整形数组,数组里有正数也有负数.二维数组首尾相接,象个一条首尾相接带子一样.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值. 设计思路: 把它转化成环一维数组的问题.把二维数组的列加起来,看作是一个以为数组,再利用一维数组的问题来解决它. 实验代码; #include<iostream.h> int max2(int arry[],int length) //跨越arry[n-1].arry[0]的最大和 { int total=0