问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C语言数组详解:从概念到内存存储

创作时间:
作者:
@小白创作中心

C语言数组详解:从概念到内存存储

引用
CSDN
1.
https://blog.csdn.net/2302_76713442/article/details/141758194

数组是C语言中非常重要的数据结构,它允许我们存储和操作一组相同类型的数据。本文将详细介绍数组的概念、一维数组和二维数组的创建、初始化、使用方法,以及它们在内存中的存储方式。

前言

数组是一组相同类型元素的集合,可以分为一维数组和多维数组,其中多维数组最常见的是二维数组。本文将详细介绍一维数组和二维数组的创建、初始化、使用方法,以及它们在内存中的存储方式。

一、数组的概念

数组是一组相同类型元素的集合,具体来说:

  • 数组中存放的是1个或者多个数据,但是数组元素个数不能为0。
  • 数组中存放的多个数据,类型是相同的。

数组分为一维数组和多维数组,多维数组一般比较多见的是二维数组。

二、一维数组

1.一维数组的创建

一维数组创建的基本语法如下:

type arr_name[常量值];

其中:

  • type 指定的是数组中存放数据的类型,可以是:charshortintfloat 等,也可以自定义的类型。
  • arr_name 指的是数组的名字,这个名字根据实际情况,起的有意义就行。
  • [ ] 中的常量值是用来指定数组的大小的,这个数组的大小根据实际的需求指定就行。

我们可以根据需要创建不同类型和大小的数组:

int age[20];
char ch[8];
double score[10];

2.一维数组的初始化

有时候,数组在创建的时候,我们需要给定一些初始值,这种就称为数组初始化。数组的初始化一般使用大括号,将数据放在大括号中。

(1)完全初始化:在定义数组时对全部数组元素赋予初值

int arr[5] = {1,2,3,4,5};

(2)不完全初始化:在定义数组时只给一部分数组元素赋予初值

int arr[5] = {1,2}; //前两个元素初始化为1和2,剩余的元素默认初始化为0
char ch[5] = {'a','b'}; //前两个元素初始化为'a'和'b',剩余的元素默认初始化为'\0'

(3)在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。例如:

int arr[5] = {1,2,3,4,5};
int arr[] = {1,2,3,4,5};
//虽然没有在方括号中指定数组的大小,但是系统会根据花括号中数据的个数来确定数组的大小

3. 一维数组的使用

C语言规定数组是有下标的,下标是从0开始的,假设数组有n个元素,最后一个元素的下标是n-1,下标就相当于数组元素的编号。

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

在C语言中数组的访问提供了下标引用操作符[],这个操作符叫:下标引用操作符。有了下标访问操作符,我们就可以轻松的访问到数组的元素了,比如我们访问下标为7的元素,我们就可以使用arr[7],想要访问下标是3的元素,就可以使用arr[3]

#include <stdio.h>
int main()
{
    int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    printf("%d\n", arr[7]);//8
    printf("%d\n", arr[3]);//4
    return 0;
}

4.一维数组在内存中的存储

依次打印数组元素的地址:

#include <stdio.h>
int main()
{
    int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    int i = 0;
    for (i = 0; i < 10; i++)
    {
        printf("&arr[%d] = %p\n", i, &arr[i]);
    }
    return 0;
}

从输出的结果我们分析,数组随着下标的增长,地址是由小到大变化的,并且我们发现每两个相邻的元素之间相差4(因为一个整型是4个字节)。所以我们得出结论:数组在内存中是连续存放的。

三、二维数组

1.二维数组的创建

二维数组创建的基本语法如下:

type arr_name[常量值1][常量值2];

举例说明:

int arr[3][5];
  • 3表示数组有3行
  • 5表示每行有5个元素
  • int 表示数组中的每个元素是整型类型

2. 二维数组的初始化

在创建数组的时候,给定一些初始值,被称为数组初始化。二维数组的初始化也是使用大括号初始化的。

(1)完全初始化:在定义数组时对全部数组元素赋予初值

int arr[3][5] = {1,2,3,4,5,2,3,4,5,6,3,4,5,6,7}; //可以将所有数据写在一个花括号内来对数组进行初始化
int arr[3][5] = {{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7}}; //也可以将数据放在几个花括号内分行来对数组进行初始化

(2)不完全初始化:在定义数组时只给一部分数组元素赋予初值

int arr1[3][5] = {1,2,3,4,5,6}; //前6个元素初始化为1~6,剩余的元素默认初始化为0
int arr2[3][5] = {{1,2},{3,4},{5,6}}; //初始化了每一行的前两个元素,每一行剩余的元素默认初始化为0

(3)在对二维数组元素赋初值时,可以省略行数,但不能省略列数(每一行的元素个数)。如下:

int arr1[][5] = {1,2,3,4,5,6};
int arr2[][5] = {1,2,3,4,5,6,7,8,9,10,11};
//系统会根据赋初值的元素个数和列数来确定二维数组的行数

3. 二维数组的使用

二维数组访问也是使用下标的形式的,二维数组是有行和列的,只要锁定了行和列就能唯一锁定数组中的一个元素。C语言规定,二维数组的行是从0开始的,列也是从0开始的。

int arr[3][5] = {{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7}};

行号和列号都是从0开始的,只要确定了行和列就能唯一锁定数组中的一个元素,比如,我们说:第0行,第0列,快速就能定位出1;第2行,第4列,就能定位出7。

#include <stdio.h>
int main()
{
    int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };
    printf("%d\n", arr[0][0]);//1
    printf("%d\n", arr[2][4]);//7
    return 0;
}

4.二维数组在内存中的存储

像一维数组一样,我们如果想研究二维数组在内存中的存储方式,也是可以打印出数组所有元素的地址的。代码如下:

#include <stdio.h>
int main()
{
    int arr[3][5] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
    int i = 0;
    int j = 0;
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 5; j++)
        {
            printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
        }
    }
    return 0;
}

从输出的结果来看,每行内部的每个元素都是相邻的,地址之间相差4个字节,跨行位置处的两个元素(如:arr[0][4]arr[1][0])之间也是差4个字节,所以二维数组中的每个元素都是连续存放的。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号