C语言中二维数组的存储和二进制数在底层的排列顺序

发布时间:2023年12月23日

1 二维数组变量的存储

  • 二维数组在内存中是按照先行后列的顺序存储的,即先存储第一行的所有元素,再存储第二行的所有元素,以此类推。
  • 每个元素在内存中占据一定的字节数,这个字节数由该元素的类型决定。例如,int类型的元素占据4个字节,float类型的元素占据4个字节等。
  • 可以通过下标访问数组元素,例如arr[i][j]表示第i行第j列的元素。

实际例子:

#include <stdio.h>

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

    printf("arr[0][0]: %d
", arr[0][0]); // 输出:arr[0][0]: 1
    printf("arr[1][2]: %d
", arr[1][2]); // 输出:arr[1][2]: 7
    printf("arr[2][3]: %d
", arr[2][3]); // 输出:arr[2][3]: 12

    return 0;
}

在这里插入图片描述

2 二维数组的二进制表示

  • 对于整型数据,其二进制表示是由若干个比特位组成的,每个比特位可以是0或1。例如,int类型的整数占用32个比特位。
  • 对于二维数组中的每个元素,其二进制表示方式与一维数组相同,只是它们在内存中的位置不同。可以通过指针运算获取二维数组中某个元素的地址,然后将其转换为对应的二进制数。

计算机中存储排列示例:
假设有一个int类型的二维数组arr[3][4],其在计算机中的存储排列如下所示:

+------+------+------+------+
| arr[0][0] | arr[0][1] | arr[0][2] | arr[0][3] |
+------+------+------+------+
| arr[1][0] | arr[1][1] | arr[1][2] | arr[1][3] |
+------+------+------+------+
| arr[2][0] | arr[2][1] | arr[2][2] | arr[2][3] |
+------+------+------+------+

其中,每个int类型元素占用4个字节(因为int类型占用4个字节),每行有4个元素,所以每行占用16个字节(4 * 4 = 16)。因此,整个二维数组占用48个字节(3 * 16 = 48)。

实际例子:

#include <stdio.h>

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

    // 获取二维数组中某个元素的二进制表示(假设为arr[1][2])
    int binary_representation = *(int*)&arr[1][2];
    printf("The binary representation of arr[1][2]: %d
", binary_representation); // 输出:The binary representation of arr[1][2]: 7

    return 0;
}

在这里插入图片描述

3 二进制数与存储位置对应的关系

  • 计算机内存中的每个存储单元都有一个唯一的地址,该地址可以被视为二进制数。例如,对于一个int类型的整数,其在内存中的地址可以表示为一个32位的二进制数。
  • 当程序需要访问某个存储单元时,会将其地址转换为对应的二进制数,然后通过总线传输到相应的存储单元中。这个过程通常由操作系统和硬件共同完成。
  • 对于二维数组中的每个元素,其存储位置可以通过计算得到,即该元素在内存中的地址等于其所在的行数乘以每行所占用的字节数再加上该元素在该行中的偏移量。例如,对于一个int类型的二维数组,每行占用4个字节(因为int类型占用4个字节),所以第i行第j列的元素在内存中的地址可以表示为i * sizeof(int) + j * sizeof(int)。其中sizeof(int)表示int类型所占用的字节数。
文章来源:https://blog.csdn.net/weixin_44205236/article/details/135171751
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。