当前位置: 首页 > news >正文

C语言教程(十二):C 语言数组详解

一、引言数组的基本概念

        数组是一组具有相同数据类型的元素的集合,这些元素在内存中连续存储。通过一个统一的数组名和下标来访问数组中的每个元素。使用数组可以方便地处理大量相同类型的数据,避免为每个数据单独定义变量。
 

二、一维数组

  2.1 数组的定义

        定义一维数组的语法格式为:数据类型  数组名[数组大小];

        数据类型:指定数组中元素的数据类型,如 `int`、`float`、`char` 等。

        数组名:是用户自定义的标识符,用于标识这个数组。

        数组大小:表示数组中元素的个数,必须是一个常量表达式。

        例子:定义一个包含 5 个整数的数组:int numbers[5];

  2.2 数组的初始化

        完全初始化:在定义数组时,为数组的每个元素都提供初始值。int numbers[5] = {1, 2, 3, 4, 5};

        部分初始化:只提供部分元素的初始值,未提供初始值的元素会被自动初始化为 0int numbers[5] = {1, 2};  // 等价于 {1, 2, 0, 0, 0}

        省略数组大小:如果在初始化时提供了所有元素的初始值,可以省略数组大小,编译器会根据初始值的个数自动确定数组大小。int numbers[] = {1, 2, 3, 4, 5};  // 数组大小为 5

  2.3 数组元素的访问

        数组元素通过下标来访问,下标从 0 开始。例如,访问 `numbers` 数组的第一个元素:

#include <stdio.h>int main() {int numbers[5] = {1, 2, 3, 4, 5};printf("数组的第一个元素: %d\n", numbers[0]);return 0;}

  2.4 数组的遍历

        可以使用循环来遍历数组中的所有元素。例如,使用 `for` 循环输出 `numbers` 数组的所有元素:

#include <stdio.h>int main() {int numbers[5] = {1, 2, 3, 4, 5};for (int i = 0; i < 5; i++) {printf("%d ", numbers[i]);}printf("\n");return 0;}

三、多维数组

   3.1 二维数组的定义

        二维数组可以看作是一个表格,有行和列。定义二维数组的语法格式为:

数据类型 数组名[行数][列数];

例子:定义一个 34 列的二维整数数组:int matrix[3][4];

   3.2 二维数组的初始化

        按行初始化:
 

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

        连续初始化:

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

        同样可以进行部分初始化,未初始化的元素会被自动初始化为 0

  3.3 二维数组元素的访问

        通过行下标和列下标来访问二维数组的元素,行下标和列下标都从 0 开始。例如,访问 `matrix` 数组第 2 行第 3 列的元素:

#include <stdio.h>int main() {int matrix[3][4] = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};printf("第 2 行第 3 列的元素: %d\n", matrix[1][2]);return 0;
}

   3.4 二维数组的遍历

        可以使用嵌套循环来遍历二维数组的所有元素。例如,使用嵌套 `for` 循环输出 `matrix` 数组的所有元素:

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

四、字符数组与字符串

  4.1 字符数组的定义与初始化

        字符数组用于存储字符序列,定义和初始化方式与普通数组类似。例如:char str[6] = {'H', 'e', 'l', 'l', 'o', '\0'};这里的 `'\0'` 是字符串结束符,用于标识字符串的结束。

  4.2 字符串的初始化简化形式

        可以使用字符串字面量来初始化字符数组:char str[] = "Hello";编译器会自动在字符串末尾添加 `'\0'`。

  4.3 字符串的输入输出

        输出:使用 `printf` 函数,格式控制符为 `%s`。

#include <stdio.h>int main() {char str[] = "Hello";printf("%s\n", str);return 0;
}

        输入:使用 `scanf` 函数,格式控制符为 `%s`。但要注意 `scanf` 遇到空格会停止读取。

#include <stdio.h>int main() {char str[100];scanf("%s", str);printf("你输入的字符串是: %s\n", str);return 0;
}

        也可以使用 `fgets` 函数来读取包含空格的字符串:

#include <stdio.h>int main() {char str[100];fgets(str, sizeof(str), stdin);printf("你输入的字符串是: %s\n", str);return 0;
}

五、数组与指针

  5.1 数组名与指针的关系

        数组名在大多数情况下会被隐式转换为指向数组第一个元素的指针。例如:

#include <stdio.h>int main() {int numbers[5] = {1, 2, 3, 4, 5};int *ptr = numbers;  // numbers 被转换为指向第一个元素的指针printf("数组的第一个元素: %d\n", *ptr);return 0;
}

  5.2 通过指针访问数组元素

        可以使用指针的算术运算来访问数组元素。例如:

#include <stdio.h>int main() {int numbers[5] = {1, 2, 3, 4, 5};int *ptr = numbers;for (int i = 0; i < 5; i++) {printf("%d ", *(ptr + i));}printf("\n");return 0;
}

六、注意事项

数组越界:访问数组元素时,下标必须在合法范围内(0 到数组大小 - 1),否则会导致数组越界,可能引发未定义行为。

数组大小固定:C 语言中的数组大小在定义时必须确定,不能动态改变。如果需要动态数组,可以使用动态内存分配函数(如 `malloc`、`calloc`、`realloc`)。

相关文章:

  • Linux mmp文件映射补充(自用)
  • AlmaLinux 9.5 调整home和根分区大小
  • CSS在线格式化 - 加菲工具
  • 推公式——耍杂技的牛
  • CH585的不升级蓝牙协议栈的备份OTA升级的几个文件解析
  • 《AI大模型应知应会100篇》 第33篇:大模型在法律文档处理中的应用
  • 图片转base64 - 加菲工具 - 在线转换
  • 华为存储5300V5升级补丁
  • 二、Python编程基础02
  • 3.1.2 materialDesign:Card 的使用介绍
  • AI数字人:元宇宙舞台上的闪耀新星(7/10)
  • 安装 vmtools
  • JETBRAINS USER AGREEMENT【2025.4.16】更新用户许可协议
  • 2.6 递归
  • 科研小白可以做哪些准备
  • 广告效果分析-广告点击率mysql+pandas
  • 初识网络原理
  • 《门》凡是过往,皆为序曲。我们的爱,和最初一样
  • 屏幕录制工具Leawo Free Screen Recorder v1.0.0.0绿色版,支持定时录制计划+实时标注
  • 【程序员 NLP 入门】词嵌入 - 如何基于计数的方法表示文本? (★小白必会版★)
  • 第四届全民阅读大会·阅读权益保障论坛举办
  • 朱守科已任西藏自治区政府党组成员、自治区公安厅党委书记
  • 透纳仍是英国最好的艺术家,浦东美术馆有他的画展
  • 湘江半程马拉松赛女配速员“跑崩”,晕倒在终点?组委会回应
  • 常方舟评《心的表达》|弗洛伊德式精神分析在我们时代的延展
  • “代课老师被男友杀害案”一审开庭,将择期宣判