一文彻底搞定C语言中的二维数组

简介: 本文详细介绍了C语言中的多维数组,包括二维和三维数组的定义、初始化方式、内存布局及遍历方法。通过具体示例讲解了多种赋值技巧,并强调了数组在内存中按行存放的特点。希望这些内容能帮助你在编程路上不断成长!君志所向,一往无前!

程序员Feri一名12年+的程序员,做过开发带过团队创过业,擅长Java、鸿蒙、嵌入式、人工智能等开发,专注于程序员成长的那点儿事,希望在成长的路上有你相伴!君志所向,一往无前!


1.多维数组

二维数组、三维数组、...都称为多维数组。本节主要讲解二维数组,三维及以上的数组,以此类推即可

二维数组,常称为矩阵(matrix)。把二维数组写成行(row)列(column)的排列形式,可以形象化地理解二维数组的逻辑结构。

2.定义方式

第一种:

int a[3][4]; //二维数组
AI 代码解读

二维数组a可看成由三个一维数组构成,它们的数组名分别为 a[0]、a[1]、a[2]。

这三个一维数组各有 4 个元素

如,一维数组 a[0] 的元素为 a[0][0]a[0][1]a[0][2]a[0][3]

二维数组a共有12个成员(3 x 4 = 12)。

三维数组如下:

int arr1[3][4][5]; //三维数组
AI 代码解读

技巧:C 语言允许声明多维数组,有多少个维度,就用多少个方括号,比如二维数组就使用两个方括号。

第二种

声明与初始化同时进行

多维数组也可以使用大括号,在声明的同时,一次性对所有成员赋值。

int a[3][4] = {
   {
   1,2,3,4},
               {
   5,6,7,8},
               {
   9,10,11,12}};
AI 代码解读

上例中, a 是一个二维数组,这种赋值写法相当于将第一维的每个成员写成一个数组。

说明:这里的地址以十进制数值进行的说明。

int main() {
   

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

    printf("%p\n",a[0]);     //0000006ac71ffd30
    printf("%p\n",a[0] + 1); //0000006ac71ffd34
    printf("%p\n",a[0] + 2); //0000006ac71ffd38
    printf("%p\n",a[0] + 3); //0000006ac71ffd3c
    printf("%p\n",a[0] + 4); //0000006ac71ffd40
    printf("%p\n",a + 1);    //0000006ac71ffd40

    printf("%p\n",a[1]);     //0000006ac71ffd40
    printf("%p\n",a[1] + 1); //0000006ac71ffd44

    return 0;
}
AI 代码解读

第三种

部分元素赋值

多维数组也可以仅为指定的位置进行初始化赋值,未赋值的成员会自动设置为“零”值 。

//指定了 [0][0] 和 [1][1] 位置的值,其他位置就自动设为 0 。
int a[2][2] = {
   [0][0] = 1, [1][1] = 2};
AI 代码解读

第四种

使用单层大括号赋值

多维数组也可以使用单层大括号赋值。不管数组有多少维度,在内存里面都是线性存储。对于a[2][2]来说, a[0][0] 的后面是 a[0][1] ,再后面是a[1][0] ,以此类推。

int a[2][2] = {
   1, 0, 0, 2};  //会自动匹配到各行各列
AI 代码解读

第五种

对于第四种的简化

在第四种的基础上,如果对全部元素赋值,那么第一维的长度可以不给出。

//int a[2][3] = {1, 2, 3, 4, 5, 6}; 
//可以写为:
int a[][3] = {
   1, 2, 3, 4, 5, 6}; 
//也可以写为:
int a[][3] = {
   {
   1, 2, 3},{
   4, 5, 6}}; //行数自然判定为2
AI 代码解读

练习:下面哪些赋值操作是正确的?(都对)

int arr1[3][2]={
   {
   1,2},{
   3,4},{
   5,6}};  //对应定义方式2

int arr2[3][2]={
   1,2,3,4,5,6};  //对应定义方式4

int arr3[][2]={
   1,2,3,4,5,6};  //对应定义方式5

int arr4[][2]={
   {
   1,2},{
   3,4},{
   5,6}}; //对应定义方式5

int arr5[][2]={
   1,2,3,4,5};  //对应定义方式5。未显式赋值的位置默认赋值为0
AI 代码解读

错误方式:

在定义二维数组时,必须指定列数(即一行中包含几个元素)

3.二维数组内存分析

矩阵形式(如3行4列形式)表示二维数组,是逻辑上的概念,能形象地表示出行列关系。而在内存中,各元素是连续存放的,不是二维的,是线性的。

C语言中,二维数组中元素排列的顺序是按行存放的。即:先顺序存放第一行的元素,再存放第二行的元素。(最右边的下标变化最快,第一维的下标变化最慢)。

比如整型数组b[3][3]在内存中的存放:

再比如关于长度

int b[3][3];
printf("%d\n",sizeof(b)); //36
printf("%d\n",sizeof(b)/sizeof(int)); //9
AI 代码解读

4.二维数组的遍历

格式:数组名[下标][下标]

跟一维数组一样,多维数组每个维度的第一个成员也是从 0 开始编号。

比如1:给指定索引位置的元素赋值

int arr1[3][5];
//给指定索引位置的元素赋值
arr1[0][0] = 12;
arr1[3][4] = 5;
AI 代码解读

比如2:查看数组元素的地址

int main() {
   

    int arr2[3][4];

    for (int i = 0; i < 3; i++) {
   
        for (int j = 0; j < 4; j++) {
   
            printf("&arr2[%d][%d] = %p\n", i, j, &arr2[i][j]);
        }
    }

    return 0;
}
AI 代码解读

输出结果如下:

好啦,关于C语言的多维数组就说到这里,要掌握哈

目录
打赏
0
1
1
0
50
分享
相关文章
|
10月前
|
C语言期末习题之求二维数组中的最大值
C语言期末习题之求二维数组中的最大值
99 0
|
10月前
|
【C语言】利用数组处理批量数据(一维数组和二维数组)
【C语言】利用数组处理批量数据(一维数组和二维数组)
107 1
|
10月前
|
C语言---二维数组&&指针
C语言---二维数组&&指针
44 0
|
10月前
|
C语言-----用二维数组解决菱形的打印问题
C语言-----用二维数组解决菱形的打印问题
96 0
C4.
|
10月前
|
C语言怎样定义和引用二维数组
C语言怎样定义和引用二维数组
C4.
130 0
|
10月前
|
C语言期末习题之二维数组转置
C语言期末习题之二维数组转置
74 0
【C语言】数组(一维、二维数组的简单介绍)
【C语言】数组(一维、二维数组的简单介绍)
178 1
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
237 4
C语言程序设计核心详解 第六章 数组_一维数组_二维数组_字符数组详解
本章介绍了C语言中的数组概念及应用。数组是一种存储同一类型数据的线性结构,通过下标访问元素。一维数组定义需指定长度,如`int a[10]`,并遵循命名规则。数组元素初始化可使用 `{}`,多余初值补0,少则随机。二维数组扩展了维度,定义形式为`int a[3][4]`,按行优先顺序存储。字符数组用于存储字符串,初始化时需添加结束符`\0`。此外,介绍了字符串处理函数,如`strcat()`、`strcpy()`、`strcmp()` 和 `strlen()`,用于拼接、复制、比较和计算字符串长度。
172 4
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等