首页 > 其他分享 >11 :数组(二)

11 :数组(二)

时间:2024-03-31 22:33:39浏览次数:14  
标签:11 存储 int 元素 Element 二维 数组

数组(二)

本节内容要点:

  • 二维数组

  • 编写处理数组的函数

10.3 二维数组

1.二维数组的定义和初始化

二维数组可以看作是数组的数组,它在编程中常用于表示表格数据、矩阵等。在大多数编程语言中,二维数组可以通过指定两个维度的大小来定义和初始化。

二维数组的定义:

   定义类型:类型名 数组名[ 行表达式 ][ 列表达式];
int a[3][4];

表示定义了一个 3×4,即 34 列总共有 12 个元素的数组 a。这 12 个元素的名字依次是:

a[0][0]、a[0][1]、a[0][2]、a[0][3];
a[1][0]、a[1][1]、a[1][2]、a[1][3];
a[2][0]、a[2][1]、a[2][2]、a[2][3]。

与一维数组一样,行序号和列序号的下标都是从 0 开始的

  • 元素 a[i][j] 表示第i+1行、第 j+1列的元素。

  • 数组 int a[m][n] 最大范围处的元素是 a[m–1][n–1]

    所以在引用数组元素时应该注意,下标值应在定义的数组大小的范围内。

行与列用常量表达式。

// 定义一个3行4列的二维数组
int array[3][4];

// 初始化二维数组
int array[3][4] = {
  {1, 2, 3, 4},
  {5, 6, 7, 8},
  {9, 10, 11, 12}
};
2.二维数组在内存中的存储

二维数组在内存中的存储是连续的,尽管它在逻辑上看起来是由多个一维数组组成的。这种存储方式称为行优先存储(row-major order),意味着内存中先存储第一行的所有元素,然后是第二行的所有元素,依此类推,直到最后一行。

行优先存储(Row-Major Order)

在行优先存储中,二维数组的元素按照行的顺序依次存储。例如,一个3行4列的二维数组在内存中的存储方式如下:

| 1 | 2 | 3 | 4 |  // 第一行
| 5 | 6 | 7 | 8 |  // 第二行
| 9 | 10| 11| 12|  // 第三行

每个元素占用的内存大小取决于数组的数据类型。例如,如果数组是整型(int),在32位系统中,每个元素可能占用4个字节。

内存地址计算

由于二维数组在内存中是连续存储的,我们可以通过计算来直接访问特定元素的内存地址。对于一个声明为int array[rows][cols]的二维数组,元素array[i][j]的内存地址可以通过下面的公式计算:

address(array[i][j]) = base_address(array) + (i * cols + j) * size_of(int)

-base_address(array)是数组在内存中的起始地址。

-size_of(int) 是单个整型元素占用的字节数。

性能考虑

由于二维数组的存储方式,访问数组中的元素时,内存访问模式是优化的,因为它遵循了CPU缓存的行缓存机制。当按顺序访问数组元素时(如遍历每一行),CPU可以有效地利用缓存,提高访问速度。

总结

二维数组在内存中的存储方式对于理解数组操作的效率至关重要。了解行优先存储的概念有助于编写更高效的代码,特别是在处理大型数据集时。此外,这种存储方式也影响了数组操作的算法设计,例如,某些算法可能需要考虑内存访问模式以减少缓存未命中和提高性能。

3.二维数组的使用

C语言中的二维数组定义及实例

#include <stdio.h>

// 定义一个3行4列的二维数组
int array[3][4] = {
  {1, 2, 3, 4},
  {5, 6, 7, 8},
  {9, 10, 11, 12}
};

int main() {
  printf("The element at [1][2]: %d\n", array[1][2]); // 输出:7
  return 0;
}

运行结果:

The element at [1][2]: 7

遍历数组

// C语言遍历二维数组示例
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 4; j++) {
        printf("Element at [%d][%d]: %d\n", i, j, array[i][j]);
    }
}

运行结果(部分展示):

Element at [0][0]: 1
Element at [0][1]: 2
...
Element at [2][3]: 12

10.4 数组与函数

传递数组给函数

#include <stdio.h>

void print2DArray(int arr[3][4]) {
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            printf("Element at [%d][%d]: %d\n", i, j, arr[i][j]);
        }
    }
}

void arrayFun() {
    int arr[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };

    print2DArray(arr);
}

int main() {
    arrayFun();
}

该段代码会输出与上述遍历二维数组相同的运行结果。

Element at [0][0]: 1
Element at [0][1]: 2
Element at [0][2]: 3
Element at [0][3]: 4
Element at [1][0]: 5
Element at [1][1]: 6
Element at [1][2]: 7
Element at [1][3]: 8
Element at [2][0]: 9
Element at [2][1]: 10
Element at [2][2]: 11
Element at [2][3]: 12

函数修改数组 尽管此处未给出具体示例,但在C/C++中,若要让函数修改传入的二维数组,可以将参数声明为指向数组的指针(如 void modify2DArray(int (*arr)[4], int rows)),这样函数内部就可以直接修改原始数组的内容。

标签:11,存储,int,元素,Element,二维,数组
From: https://blog.csdn.net/m0_67671144/article/details/137210495

相关文章

  • 第11章 使用类——运算符重载(二)运算符重载限制
    本文章是作者根据史蒂芬·普拉达所著的《C++PrimerPlus》而整理出的读书笔记,如果您在浏览过程中发现了什么错误,烦请告知。另外,此书由浅入深,非常适合有C语言基础的人学习,感兴趣的朋友可以自行阅读此书籍。运算符重载限制可以被重载的运算符有:+-*/%^&|......
  • JavaScript基础篇3【数组】
    今日学习内容什么是数组简单理解就是用于临时存储同类数据,本质上是一种具有顺序的特殊对象【当然其实是可以存储不同的数据类型的,只是说那样做很少,所以一般就如前一样理解】数组的定义JavaScript中有两种定义数组的方式:实例化Array对象【称之为“完整形式”】vararr......
  • 代码随想录算法训练营第11天 | 栈和队列
    20.有效的括号遇到左括号入栈,遇到右括号弹出boolisValid(strings){ stack<char>kuohao; charc; for(chara:s){ switch(a) { case'(': case'{': case'[': kuohao.push(a); break; case')': case'......
  • 代码随想录第11天: 栈的应用
    20.有效的括号力扣题目链接(opensnewwindow)给定一个只包括‘(’,‘)’,‘{’,‘}’,‘[’,‘]’的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例1:输入:“()......
  • 洛谷P1102 A-B数对
    双指针做法:  反过来,从后往前看也是一样的:#include<iostream>#include<stdio.h>#include<algorithm>#include<string>#include<cmath>#defineFor(i,j,n)for(inti=j;i<=n;++i)usingnamespacestd;constintN=2e5+5;int......
  • lowbit 树状数组
    ......
  • 111
    1.回顾你过去将近3年的学习经历当初你报考的时候,是真正喜欢计算机这个专业吗?你现在后悔选择了这个专业吗?你认为你现在最喜欢的领域是什么(可以是计算机的也可以是其它领域)?•我还是比较喜欢的,并没有后悔,喜欢一些自动化控制的领域,他需要用到计算机,尤其是编程,这项技能必不可少。......
  • 11
    请阅读北航陈彦吉同学的这篇博客中(地址:https://www.cnblogs.com/ChildishChange/p/7363123.html)的各参考资料,并回答如下问题:1.回顾你过去将近3年的学习经历当初你报考的时候,是真正喜欢计算机这个专业吗?你现在后悔选择了这个专业吗?你认为你现在最喜欢的领域是什么(可以是计算机......
  • 111
    1.回顾你过去将近3年的学习经历当初你报考的时候,是真正喜欢计算机这个专业吗?作为一个学生,回顾我过去将近三年的学习经历是一段充满挑战和成长的旅程。当初我报考计算机专业时,我对计算机确实有着浓厚的兴趣。我喜欢探索新技术,解决问题,并且觉得计算机领域充满了无限的可能性。在......
  • 111
    请阅读北航陈彦吉同学的这篇博客中(地址:https://www.cnblogs.com/ChildishChange/p/7363123.html)的各参考资料,并回答如下问题:1.回顾你过去将近3年的学习经历当初你报考的时候,是真正喜欢计算机这个专业吗?你现在后悔选择了这个专业吗?你认为你现在最喜欢的领域是什么(可以是计算机......