C语言数组详解

系列文章目录

第一章 C语言基础知识

第二章 C语言控制语句

第三章 C语言函数详解

第四章 C语言数组详解

第五章 C语言操作符详解

第六章 C语言指针详解


文章目录

系列文章目录

文章目录

1. 一维数组

1.1 数组的创建

1.2 数组的初始化

1.3 一维数组的使用

2. 二维数组

2.1 二维数组的创建

2.2 二维数组的初始化

2.3 二维数组的使用

3. 数组作为函数参数

项目练习


1. 一维数组

数组是编程中一种基础且重要的数据结构,用于存储一系列相同类型的元素,这些元素在内存中是连续存放的。在 C 语言中,数组可以存储任何数据类型的元素,如整数、浮点数、字符等。了解数组的工作原理及其特性对于编写有效和高效的程序至关重要。

1.1 数组的创建

type arrayName[arraySize];
  •  type 是数组中元素的数据类型,如 intfloatchar 等。
  • arrayName 是你为数组选择的名称。
  • arraySize 是数组中元素的数量,必须是大于零的整数。
  • 数组在内存中是连续存放的。随着数组下标的增长,元素的地址,也在有规律的递增。  
int arr1[10];
char arr3[10];
float arr4[1];
double arr5[20];

1.2 数组的初始化

数组可以在声明时立即初始化,也可以在声明后通过索引进行初始化。

在声明时初始化

int numbers[5] = {1, 2, 3, 4, 5};
int numbers[5] = {1, 2}; // 等同于 {1, 2, 0, 0, 0}
int numbers[] = {1, 2, 3, 4, 5}; // 数组大小自动设为 5

使用索引初始化

int numbers[5];
numbers[0] = 1;
numbers[1] = 2;
numbers[2] = 3;
numbers[3] = 4;
numbers[4] = 5;

1.3 一维数组的使用

一旦数组被初始化,你可以通过索引访问任何位置的元素,进行读取或修改操作。

printf("%d\n", numbers[2]); // 输出 3
numbers[2] = 100; // 将数组中第三个元素修改为 100
printf("%d\n", numbers[2]); // 输出 100

2. 二维数组

2.1 二维数组的创建

二维数组在内存中也是连续存储的。

type arrayName[rows][columns];
  • type 是数组元素的数据类型,例如 intfloatchar
  • arrayName 是数组的名称。
  • rows 指定数组的行数。
  • columns 指定数组的列数。
int arr[3][4];
char arr[3][5];
double arr[2][4];

2.2 二维数组的初始化

在声明时初始化

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

如果省略某些值,它们会自动初始化为 0(对于基本数据类型):

int matrix[3][4] = {
  {1, 2},
  {5, 6},
  {9, 10}
};  // 缺失的元素将被初始化为 0

2.3 二维数组的使用

二维数组中的元素通过两个索引访问,一个用于行,一个用于列。

printf("%d\n", matrix[0][2]);  // 输出第一行第三列的元素,即 3
matrix[0][2] = 100;            // 修改第一行第三列的元素为 100

代码示例:

#include <stdio.h>
int main()
{
    // 声明并初始化一个 3 行 4 列的二维数组,所有元素初始化为 0
    int arr[3][4] = {0};
    
    // 外层循环,控制行的索引
    for(int i = 0; i < 3; i++)
    {
        // 内层循环,控制列的索引
        for(int j = 0; j < 4; j++)
        {
            // 为数组每个元素赋值,值为行索引乘以 4 加上列索引
            arr[i][j] = i * 4 + j;
        }
    }

    // 再次使用外层循环遍历数组行
    for(int i = 0; i < 3; i++)
    {
        // 内层循环遍历数组列
        for(int j = 0; j < 4; j++)
        {
            // 打印每个元素的值,后跟一个空格
            printf("%d ", arr[i][j]);
        }
        // 每打印完一行后输出换行符,以便每行打印在新的一行
        printf("\n");
    }

    return 0;
}

在这个嵌套循环中:

  • 外层循环变量 i 从 0 到 2,代表数组的行。
  • 内层循环变量 j 从 0 到 3,代表数组的列。

数组的每个元素 arr[i][j] 被赋值为 i*4+j。这种赋值方式使得数组的元素按照其在数组中的位置线性递增:

  • i = 0 时,各列的元素为 0, 1, 2, 3
  • i = 1 时,各列的元素为 4, 5, 6, 7
  • i = 2 时,各列的元素为 8, 9, 10, 11

3. 数组作为函数参数

在 C 语言中,数组可以作为参数传递给函数。这使得函数能够处理数组中的数据,执行诸如搜索、排序、统计等操作。然而,由于 C 语言的数组不存储其自身的长度信息,当数组作为参数传递给函数时,通常需要额外传递数组的长度。

传递方式

在 C 中,数组默认通过指针传递。当你将一个数组作为参数传递给函数时,实际上传递的是数组第一个元素的地址。这意味着在函数内部对数组元素所做的修改将影响原始数组。

函数声明

当你想在函数中使用数组时,可以在函数声明中使用以下任一方式声明数组参数:

void processArray(int arr[], int size);
void processArray(int *arr, int size);

这两种声明方式在功能上是等价的,arr[]*arr 都表示一个指向整数的指针,它指向数组(或其一部分)的起始位置。

在 C 语言中,数组名是指向数组第一个元素的指针。它代表数组在内存中的起始地址,因此通常被视为数组的首地址。数组名在不同的上下文中可以有稍微不同的行为,特别是在作为函数参数时,它们的行为就如同指向数组类型的指针。

例如,如果 arr 是一个整型数组,那么 arr 就可以被视为指向 arr[0] 的指针。尽管数组名本身表示数组的起始地址,但通过与索引配合使用,它可以访问数组中的任何元素。例如,arr[i] 访问从起始地址开始的第 i 个元素。

代码示例:
使用数组作为参数的函数示例,该函数计算整数数组的总和:

#include <stdio.h>

// 函数定义,计算整数数组的总和
int sumArray(int arr[], int size) {
    int sum = 0;  // 初始化总和为 0
    for (int i = 0; i < size; i++) {
        sum += arr[i];  // 将每个数组元素加到总和中
    }
    return sum;  // 返回计算的总和
}

int main() {
    int numbers[] = {1, 2, 3, 4, 5};  // 声明并初始化一个整数数组
    int total = sumArray(numbers, 5);  // 调用函数并传递数组和数组的大小
    printf("The total sum is: %d\n", total);
    return 0;
}

在这个示例中,sumArray 函数接收一个整数数组和数组的大小作为参数。函数内部使用 for 循环遍历数组,并将所有元素的值累加到 sum 变量中。由于数组是通过指针传递的,arr 参数在函数中直接引用了原始数组 numbers

项目练习

基于C语言的闯关游戏
(还没编完。。。正在努力中。。。)

  • 41
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
C语言数组排序函数qsort是标准库函数,用于对数组进行排序。它的使用方法是通过传入一个比较函数来指定排序的规则。在给出的代码中,我们可以看到使用qsort函数对一个整型数组进行升序排序的例子。\[1\] 为了实现qsort函数的功能,我们可以使用一种较为简单的排序算法,比如冒泡排序算法来模拟实现一个具有排序数组、字符串、结构体等功能的bubble_sort函数。\[2\]这个函数的参数可以仿照qsort函数的参数,包括要排序的数组的起始地址、元素个数、每个元素的大小以及一个比较函数。\[3\] 具体实现bubble_sort函数的函数体可以根据冒泡排序算法来编写,通过比较相邻的元素并交换位置来实现排序。排序的规则可以通过比较函数来指定,根据需要可以实现升序或降序排序。 总结起来,qsort是C语言标准库中的数组排序函数,可以通过传入比较函数来指定排序规则。如果想要模拟实现类似功能的排序函数,可以使用一种简单的排序算法,比如冒泡排序,并根据需要实现相应的比较函数。 #### 引用[.reference_title] - *1* *2* *3* [【C语言】qsort()函数详解:能给万物排序的神奇函数](https://blog.csdn.net/weixin_72357342/article/details/130628874)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TENET-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值