数组之一维数组

1. 数组的概念

数组是一组相同元素的集合,

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

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

2. 一维数组的创建和初始化

2.1 数组创建

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

bash 复制代码
type arr_name[常量值]

存放在数组的值被称为数组的元素 ,数组在创建的时候可以指定数组的大小数组的元素类型。

  • type指定的数组中存放的数据的类型,可以是charshortintfloat等,也可以自定义的类型。
  • arr_name:指定的数组的名称,这个名字根据实际应用场景,起的名字有意义即可
  • []中的内容是一个常量值,用来指定数组的大小,这个大小可以根据实际情况指定即可

比如,我们现在想要存放某个班级的20名学生的数学成绩,那么我们可以创建一个数组,如下,

arduino 复制代码
#include <stdio.h>
int main()
{
    // 创建和初始化
    // 数组有20个元素,每个元素的类型为 int
    int math[20] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};//完全初始化
    int math2[20] = { 0,1,2,3,4,5 }; // 不完全初始化,其余的元素默认初始化为0
​
    return 0;
}

当然,我们也可以根据需要创建其他类型和大小的数组

arduino 复制代码
#include <stdio.h>
int main()
{
    char ch[5] = { 'a','b' }; 
    char ch2[5] = "abc";
​
    double arr[6] = { 0.0 }; // 不完全初始化,大小为6,数组中的元素类型为double
    int arr2[3] = { 1,2,3 }; // 完全初始化
    return 0;
}

2.2 数组的初始化

如上面的代码,在创建数组时,不仅可以指定数组的大小和数组中元素的类型,我们还可以给定一些初始值,这种就被称为初始化。我们进行数组的初始化时,一般使用大括号,将数组元素放在大括号中。

数组初始化的方式可以分为2种,一种是完全初始化,一种是不完全初始化。

arduino 复制代码
//不完全初始化
int arr[5] = { 1,2,3,4,5 };
//不完全初始化
int arr2[5] = { 1 }; // 第一个元素初始化值为1,剩余元素默认初始化值为0

并且这里也需要注意的是一种错误的初始化方式,即初始化的值的个数超过了给定数组的大小,会出现如下的警告:

arduino 复制代码
// 初始化的值的个数超过了给定数组的大小
int arr[5] = { 1, 2, 3, 4, 5, 6 };

2.3 数组的类型

数组也是有类型的,数组是一个自定义类型,去掉数组名剩下的部分就是数组的类型

例如,

ini 复制代码
int arr1[10];
int arr2[32];
char ch[3];

我们按键盘上的F10键,进入调试阶段,通过监视器可以看到

  • arr1 数组的类型是 int [10]
  • arr2 数组的类型是 int [32]
  • ch 数组的类型是 char [5]

这里需要注意的是arr1 的数组的类型和arr2 的数组的类型是不同的。

3. 一维数组的使用

3.1 数组的下标

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

ini 复制代码
int arr[10] = { 1,2,3,4.5,6,7,8,9,10 };

在C语言中数组访问提供了一个操作符[],这个操作符叫做:下标引用操作符

有了下标引用操作符,我们就可以轻松的访问到数组的元素了,比如我们访问下标为7的元素,我们就可以是使用arr[7];想要访问下标为3的元素,我们就可以使用arr[3],参考代码如下

arduino 复制代码
#include <stdio.h>
int main()
{
    // 当对数据进行初始化的时候,数组的大小可以被省略。
    // 编译器会根据数组的初始化内容,自动计算数组元素的个数
    // int arr[10] = { 1,2,3,4.5,6,7,8,9,10 };
    //          10 是指数组的元素个数的大小
    int arr[] = { 1,2,3,4.5,6,7,8,9,10 };
    printf("%d\n", arr[7]);
    //            这里的7是数组元素的下标
    printf("%d\n", arr[3]);
    return 0;
}

3.2 数组元素的打印

如果要访问整个数组的内容,应该如何编写程序呢?

我们只需要产生数组所有元素的下标就可以了,那么,下面提供一个参考代码,利用for循环产生0~9的下标

ini 复制代码
#include <stdio.h>
int main()
{
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    // 对应的下标 0,1,2,3,4,5,6,7,8, 9
    int i = 0;
    for (i = 0; i < 10; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

3.3 数组的输入

代码题:使用scanf函数给数组输入10个值,并通过printf函数输出数组的元素。

下面是参考代码

ini 复制代码
#include <stdio.h>
int main()
{
    int arr[10] = {0};//初始化数组
    int i = 0; // 初始化下标
    for (i = 0; i < 10; i++)
    {
        // 1,2,3,4,5,6,7,8,9,10
        scanf("%d", &arr[i]);
    }
    // 打印
    for (i = 0; i < 10; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

那么如果是打印输入10个元素的地址呢?

arduino 复制代码
// %p - 地址
#include <stdio.h>
int main()
{
    int arr[] = { 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(这是因为一个int类型的数据占4个字节)。因此我们可以得出结论:数组在内存中是连续存放的。这为后期学习使用指针访问数组奠定了基础。

5. sizeof计算数组元素个数

在遍历数组的时候,我们通常需要知道数组中元素的个数,在上面的例子中我们是事先已知数组的长度的,那么C语言中,有没有可以直接通过程序来计算数组中元素个数的方法吗? 答案是有的,可以使用sizeof

sizeof是C语言的一个关键字,是可以计算类型或者变量大小的,其实sizeof也可计算数组的长度,例如

c 复制代码
#include <stdio.h>
int main()
{
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    int a = 0;
    printf("%zd\n", sizeof(a)); // 单位:字节  4
    printf("%zd\n", sizeof(int)); // 单位:字节 4
​
    printf("%zd\n", sizeof(arr)); // 40  = 4 * 10 
    int sz = sizeof(arr) / sizeof(arr[0]); // 40 / 4 = 10
    printf("%d\n", sz);
    return 0;
}

那么,我们sizeof计算出了数组的长度为10,就可以将上面代码中手动输入的10替换为sizeof的方法,参考代码如下,

ini 复制代码
#include <stdio.h>
int main()
{
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    
    int i = 0;
    for (i = 0; i < sz; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}
相关推荐
潼心1412o2 小时前
C语言(长期更新)第6讲:函数
c语言·开发语言
学不动CV了3 小时前
单片机ADC采集机理层面详细分析(二)
c语言·arm开发·stm32·单片机·嵌入式硬件·开源·51单片机
学不动CV了3 小时前
51核和ARM核单片机OTA实战解析(二)
c语言·arm开发·stm32·单片机·嵌入式硬件·51单片机
程序员编程指南3 小时前
Qt 与 WebService 交互开发
c语言·开发语言·c++·qt·交互
程序员编程指南4 小时前
Qt 远程过程调用(RPC)实现方案
c语言·c++·qt·rpc·系统架构
花开月满西楼5 小时前
电子设计大赛【C语言核心知识点】讲解
c语言
用户6120414922137 小时前
C语言做的井字棋小游戏
c语言·后端·游戏
##echo9 小时前
嵌入式Linux裸机开发笔记9(IMX6ULL)GPIO 中断实验(1)
linux·c语言·笔记·单片机·嵌入式硬件
扶摇直上——————9 小时前
C专题8:文件操作2
c语言·文件操作