首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >C语言 数组

C语言 数组

作者头像
用户11872857
发布2025-12-17 15:36:21
发布2025-12-17 15:36:21
5900
举报

前言

在 C 语言的世界里,数组是一个极为重要的数据结构,它为开发者提供了一种高效组织和管理数据的方式。无论是处理简单的数值序列,还是复杂的矩阵运算,数组都发挥着关键作用。本文将带你深入探索 C 语言数组的各个方面,从基础概念到实际应用,让你对数组有全面且深入的理解。


目录

一、数组基础概念

二、一维数组的创建与初始化

2.1 一维数组的创建

2.2 数组的初始化

2.3 数组的类型

三、一维数组的使用

3.1 数组下标

3.2 数组元素打印

3.3 数组输入

四、一维数组在内存中的存储

五、sizeof 计算数组元素个数

六、二维数组

6.1 二维数组的创建

6.2 二维数组的初始化

6.3 二维数组的使用

6.4 二维数组在内存中的存储

七、C99 中的变长数组

八、数组练习

8.1 多个字符从两端移动,向中间汇聚

8.2 二分查找


一、数组基础概念

数组是一组相同类型元素的集合。这意味着数组中至少有一个元素,且所有元素类型一致。它分为一维数组和多维数组,其中二维数组较为常见。比如,想要存储一个班级 20 人的数学成绩,就可以创建一个 int math[20] 的一维数组,这里 int 是元素类型,math 是数组名,20 表示数组大小。

二、一维数组的创建与初始化

2.1 一维数组的创建
代码语言:javascript
复制
//一维数组的基本语法如下
type arr_name[常量值];

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

type 指定的是数组中存放数据的类型,可以是char、short、int、float 等,也可以⾃定义的类型(后期会进行讲解)。

arr_name 指的是数组名的名字,这个名字根据实际情况,起的有意义就⾏。

[ ]中的常量值是⽤来指定数组的⼤⼩的,这个数组的⼤⼩是根据实际的需求指定就⾏。

代码语言:javascript
复制
//假设班级有20个人,当我们想要存储一个班级的数学成绩时
int math[20];

//当然我们也可以根据需要创建其他类型和⼤⼩的数组
char ch[8];
double score[10];
2.2 数组的初始化

数组的初始化⼀般使⽤⼤括号,将数据放在⼤括号中

代码语言:javascript
复制
//完全初始化
int arr[5] = {1,2,3,4,5};

//不完全初始化
int arr2[6] = {1};//第⼀个元素初始化为1,剩余的元素默认初始化为0

//错误的初始化 - 初始化项太多
int arr3[3] = {1, 2, 3, 4};
2.3 数组的类型

数组也是有类型的,数组算是⼀种⾃定义类型,去掉数组名留下的就是数组的类型

代码语言:javascript
复制
int arr1[10];
int arr2[12];
char ch[5];

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

三、一维数组的使用

3.1 数组下标

C 语言规定数组下标从 0 开始,若数组有 n 个元素,最后一个元素下标为 n - 1 。通过下标引用操作符 [] 可以访问数组元素。例如,int arr[10] = {1,2,3,4,5,6,7,8,9,10}; ,访问下标为 7 的元素用 arr[7] ,它的值为 8 。

3.2 数组元素打印

要访问整个数组内容,可以使用 for 循环生成所有元素的下标,再通过下标访问元素并打印。示例代码如下:

代码语言:javascript
复制
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("%d ", arr[i]);
    }
    return 0;
}
3.3 数组输入

根据需求给数组输入数据,同样借助 for 循环。在循环中使用 scanf 函数读取输入值并赋给数组元素,代码如下:

代码语言:javascript
复制
int main() 
{
    int arr[10]; 
    int i = 0;
    for(i=0; i<10; i++)
    {
        scanf("%d", &arr[i]);
    }
    for(i=0; i<10; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

四、一维数组在内存中的存储

通过打印数组元素地址可以发现,数组在内存中是连续存放的。随着下标的增长地址由小到大变化,且相邻元素地址相差 4 个字节(以整型数组为例)。

五、sizeof 计算数组元素个数

sizeof 是 C 语言关键字,可用于计算类型或变量大小,也能计算数组大小。通过 sizeof(arr) 得到数组所占内存空间总大小(字节),再除以单个元素大小 sizeof(arr[0]) ,就能算出数组元素个数。示例代码如下:

六、二维数组

6.1 二维数组的创建

二维数组可以看作是数组元素为一维数组的数组。创建语法为 type arr_name[常量值1][常量值2]; ,例如 int arr[3][5]; ,其中 3 表示数组有 3 行,5 表示每一行有 5 个元素(3行5列),int 表示元素类型,arr 是数组名。

6.2 二维数组的初始化
  1. 不完全初始化:如 int arr1[3][5] = {1,2}; ,只初始化部分元素,其余元素默认初始化为 0 。
  2. 完全初始化int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7}; ,按顺序给所有元素赋值。
  3. 按照行初始化int arr4[3][5] = {{1,2},{3,4},{5,6}}; ,以行为单位进行初始化。
  4. 初始化时可以省略行,但不能省略列:如 int arr5[][5] = {1,2,3}; ,编译器会根据初始化元素个数确定行数。
6.3 二维数组的使用

二维数组的下标:二维数组访问也使用下标,行和列都从 0 开始。例如,int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};arr[2][4] 表示第 2 行第 4 列的元素,值为 7

二维数组的输入和输出:借助两层 for 循环,外层循环控制行,内层循环控制列,实现对整个二维数组的输入和输出。

6.4 二维数组在内存中的存储

打印二维数组所有元素地址可知,二维数组中的每个元素都是连续存放的,每一行内部相邻元素地址相差 4 个字节,跨行元素之间地址也相差 4 个字节。

七、C99 中的变长数组

在 C99 标准之前,数组大小只能用常量、常量表达式指定,或者在初始化时省略。C99 引入变长数组(VLA)特性,允许使用变量指定数组大小。例如,

int n = a+b;

int arr[n];

这里 arr 就是变长数组,其长度在运行时根据 n 的值确定,所以变长数组不能初始化。它的优势在于程序员无需在开发时预估数组长度,可在运行时分配精确长度。不过,VS2022 不支持该特性,在 gcc 编译器上可正常测试。下面是我在vs2022上编译器测试的:

gcc上面测试的:

八、数组练习

8.1 多个字符从两端移动,向中间汇聚

编写代码实现多个字符从两端移动向中间汇聚。示例代码如下:

代码语言:javascript
复制
#include <stdio.h>
#include <windows.h> 
#include <string.h>
int main() 
{
    char arr1[] = "welcome to bit...";
    char arr2[] = "#################";
    int left = 0;//数组第一个元素的下标
    int right = strlen(arr1)-1;//数组最后一个元素的下标
    printf("%s\n", arr2);
    while(left<=right) 
    {
        Sleep(1000); //休眠1000ms,观察变化的过程
        arr2[left] = arr1[left];
        arr2[right] = arr1[right];
        left++;
        right--;
        printf("%s\n", arr2);
    }
    return 0;
}
8.2 二分查找

在升序数组中查找指定数字,二分查找效率更高。通过不断取中间元素与目标数字比较,缩小查找范围。示例代码如下:

代码语言:javascript
复制
int main() 
{
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    int left = 0;
    int right = sizeof(arr)/sizeof(arr[0])-1;//最后一个元素索引
    int key = 7; //要查找的元素
    int mid = 0; 
    int find = 0;//标志
    while(left<=right) 
    {
        mid = left+(right-left)/2; 
        if(arr[mid]>key) 
        {
            right = mid-1;
        } 
        else if(arr[mid] < key) 
        {
            left = mid+1;
        }
        else 
        {
            find = 1;
            break;
        }
    }
    if(1 == find )
    {
        printf("找到了,下标是%d\n", mid);
    }
    else 
    {
        printf("找不到\n");
    }
    return 0;
}

数组在 C 语言编程中占据着核心地位,无论是日常开发还是算法实现,都离不开对数组的熟练运用。希望通过本文的介绍,你能对 C 语言数组有更深入的理解和掌握,在编程道路上更上一层楼。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-12-13,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 一、数组基础概念
  • 二、一维数组的创建与初始化
    • 2.1 一维数组的创建
    • 2.2 数组的初始化
    • 2.3 数组的类型
  • 三、一维数组的使用
    • 3.1 数组下标
    • 3.2 数组元素打印
    • 3.3 数组输入
  • 四、一维数组在内存中的存储
  • 五、sizeof 计算数组元素个数
  • 六、二维数组
    • 6.1 二维数组的创建
    • 6.2 二维数组的初始化
    • 6.3 二维数组的使用
    • 6.4 二维数组在内存中的存储
  • 七、C99 中的变长数组
  • 八、数组练习
    • 8.1 多个字符从两端移动,向中间汇聚
    • 8.2 二分查找
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档