C语言:数组

1. 数组的定义

在 C 语言中,数组是一种数据结构,它可以存储多个相同类型的数据元素。例如,要存储 10 个整数,可以定义一个整数数组。数组的定义格式一般为:

c 复制代码
数据类型 数组名[数组大小];

例如,

c 复制代码
int scores[10];

定义了一个名为scores的整数数组,它可以存储 10 个整数。这里的int是数据类型,表示数组中的元素都是整数,scores是数组名,用于在程序中引用这个数组,10是数组大小,指定了数组可以容纳的元素个数。

2. 数组的初始化

可以在定义数组的时候对其进行初始化。例如,

c 复制代码
int numbers[5] = {1, 2, 3, 4, 5};

这就将数组numbers的 5 个元素分别初始化为 1、2、3、4 和 5。

如果初始化的值少于数组大小,剩下的元素会被自动初始化为 0(对于数值类型)。例如,

c 复制代码
int array[3]={1};

那么array0=1,array1=0,array2=0。

还可以省略数组大小,让编译器根据初始化的值的个数来确定数组大小。例如,

c 复制代码
int values[] = {6, 7, 8};

这里编译器会自动将数组values的大小确定为 3。

3. 数组元素的访问

数组中的元素通过索引(下标)来访问。在 C 语言中,数组的索引是从 0 开始的。例如,对于上面定义的numbers数组,numbers0表示数组中的第一个元素,其值为 1;numbers4表示数组中的第五个元素,其值为 5。

可以在程序中通过索引来读取和修改数组元素的值。例如:

c 复制代码
#include <stdio.h>
int main()
{
    int numbers[5] = {1, 2, 3, 4, 5};
    // 访问并修改数组元素
    numbers[2] = 10;
    printf("%d\n", numbers[2]);
    return 0;
}

在这个例子中,将numbers2的值修改为 10,然后通过printf函数输出修改后的numbers2的值。

4. 数组在内存中的存储方式

数组的元素在内存中是连续存储的。例如,对于int numbers5数组,假设数组的起始地址为0x1000,每个int类型占 4 个字节(在 32 位系统中),那么numbers0存储在地址0x1000,numbers1存储在地址0x1004,numbers2存储在地址0x1008,以此类推。

这种连续存储的方式使得可以通过指针算术来高效地访问数组元素。例如,*(numbers + 1)等价于numbers1,这里numbers可以看作是一个指向数组第一个元素的指针,numbers+1指向数组的第二个元素,*(numbers + 1)就可以获取第二个元素的值。

5. 多维数组

C 语言支持多维数组。例如,二维数组的定义格式为:

c 复制代码
数据类型 数组名[行数][列数];

例如,

c 复制代码
int matrix[3][4];

定义了一个二维数组,它可以看作是一个 3 行 4 列的矩阵,用于存储整数。

二维数组的初始化可以按行进行。例如,

c 复制代码
int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};

这就初始化了一个 2 行 3 列的二维数组。也可以写成一维的形式,如

c 复制代码
int matrix[2][3] = {1, 2, 3, 4, 5, 6};

编译器会按照列优先的顺序(在 C 语言中通常是行优先顺序)将这些值分配到数组元素中。

访问二维数组元素时,需要使用两个索引。例如,matrix12表示访问第二行(索引从 0 开始,所以是 1)第三列(索引为 2)的元素。

6. 数组作为函数参数

数组可以作为函数的参数传递。当数组作为参数传递给函数时,实际上传递的是数组的首地址。例如:

c 复制代码
#include <stdio.h>
void printArray(int arr[], int size)
{
    for (int i = 0; i < size; i++)
    {
        printf("%d ", arr[i]);
    }
}
int main()
{
    int numbers[5] = {1, 2, 3, 4, 5};
    printArray(numbers, 5);
    return 0;
}

在这个例子中,printArray函数接受一个整数数组arr和数组大小size作为参数,通过循环遍历数组并输出每个元素的值。在main函数中,将numbers数组和它的大小 5 传递给printArray函数。

7. 动态数组

在 C 语言中,还可以使用动态内存分配来创建数组。例如,通过malloc函数可以在堆上分配内存来创建一个动态数组。

c 复制代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int *dynamicArray;
    int size = 5;
    // 分配内存
    dynamicArray = (int *)malloc(size * sizeof(int));
    if (dynamicArray == NULL)
    {
        printf("内存分配失败\n");
        return 1;
    }
    // 初始化动态数组
    for (int i = 0; i < size; i++)
    {
        dynamicArray[i] = i + 1;
    }
    // 使用动态数组
    for (int i = 0; i < size; i++)
    {
        printf("%d ", dynamicArray[i]);
    }
    // 释放内存
    free(dynamicArray);
    return 0;
}

在这个例子中,首先使用malloc函数分配了足够的内存来存储size个int类型的元素,然后对动态数组进行初始化和使用,最后使用free函数释放了分配的内存,以避免内存泄漏。

相关推荐
Msshu1239 小时前
2~5串锂电快充优选|XSP36 Type‑C升压/升降压快充管理芯片
数据结构·随机森林·贪心算法·排序算法·线性回归·启发式算法
老王爱玩车10 小时前
深入理解指针2
c语言·开发语言·学习
动词ing12 小时前
【学习笔记】数据结构栈与队列(栈先进后出+队列先进先出+括号匹配+消消乐模型)
数据结构·笔记·学习
l1t12 小时前
用superpi、tinypi、tpi等工具计算圆周率的比较
c语言·算法
a1879272183112 小时前
【算法】链表(二):链表上的双指针——变速、异链与定距,和一份路程账本
数据结构·算法·leetcode·链表·go·指针·环形链表
zcmodeltech13 小时前
火电厂模型能演示冷态启动和故障处理吗?——基于STM32与Modbus RTU的集控实训控制系统设计
数据结构·stm32·单片机·嵌入式硬件·能源
Doubbbbbbble云14 小时前
区间合并问题的常见算法模式与优化思路4
java·数据结构·算法
David猪大卫14 小时前
【C++修炼】哈希表的实现
数据结构·c++·笔记·学习·算法·哈希算法·散列表
零依赖极客14 小时前
Day 8·1 自注意力机制:Q·K^T/softmax/V的在线计算
c语言·arm开发·人工智能·llama
水饺编程16 小时前
第5章,[Win32 章节] :在平面直角坐标系中描点
c语言·c++·windows·visual studio