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

一维数组的创建、初始化与使用指南

目录

一、数组的概念

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

1、数组创建

说明:

示例:

2、数组初始化

注意事项:

3、数组的类型

三、一维数组的使用

1、数组下标

2、数组元素的打印

3、数组的输入

4、补充注意事项

四、数组在内存中的存储及元素个数计算

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

重要结论:

2、使用sizeof计算数组元素个数

sizeof运算符简介

示例:

计算数组元素个数

实现代码:

优点:


一、数组的概念

        数组是编程中一种基本且重要的数据结构,它是一组相同类型元素的集合。这个概念包含两个关键点:

  • 元素数量:数组可以存放一个或多个数据元素,但元素个数不能为零(即数组不能为空)

  • 元素类型:数组中所有元素必须具有相同的数据类型

数组可以分为:

  • 一维数组:最简单的数组形式,元素线性排列

  • 多维数组:常见的是二维数组(如矩阵),理论上可以有任意维度


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

1、数组创建

一维数组创建的基本语法:

type arr_name[常量值];

说明:

  • type:指定数组元素的数据类型,可以是基本类型(charshortintfloat等)或自定义类型

  • arr_name:数组名称,应遵循标识符命名规则并具有描述性

  • [常量值]:定义数组大小,必须是编译时的常量

示例:

int math[20];       // 存储20个学生的数学成绩
char ch[8];         // 存储8个字符
double score[10];   // 存储10个双精度浮点数

2、数组初始化

数组初始化是指在创建数组时为其元素赋初值,使用大括号{}包围初始值:

// 完全初始化
int arr[5] = {1, 2, 3, 4, 5};// 不完全初始化 - 剩余元素自动初始化为0
int arr2[6] = {1};  // 错误初始化 - 初始值过多
int arr3[3] = {1, 2, 3, 4};  // 编译错误

注意事项:

  • 当初始值少于数组大小时,剩余元素自动初始化为0

  • 初始值数量不能超过数组大小

  • C99标准支持指定初始化器(designated initializers):int arr[10] = {[3]=5, [7]=9}

3、数组的类型

        数组本身也是一种类型,其类型由元素类型和数组大小共同决定。去掉数组名后剩下的部分就是数组类型:

int arr1[10];   // 类型为 int [10]
int arr2[12];   // 类型为 int [12]
char ch[5];     // 类型为 char [5]

        在C语言中,数组不是自定义类型(user-defined type),而是派生类型(derived type),它是由基本类型(如intchar等)或自定义类型(如结构体)构造而成的复合数据类型。

注意:int [10]int [12]是两种不同的数组类型。


三、一维数组的使用

1、数组下标

C语言数组特性:

  • 下标从0开始

  • 最后一个元素的下标是n-1(n为数组大小)

  • 使用[]操作符访问元素(称为下标引用操作符)

示例:

int arr[10] = {1,2,3,4,5,6,7,8,9,10};printf("%d\n", arr[0]);  // 访问第一个元素,输出1
printf("%d\n", arr[7]);  // 访问第8个元素,输出8

2、数组元素的打印

要遍历整个数组,通常使用for循环配合下标访问:

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

3、数组的输入

可以通过循环为数组元素赋值:

#include <stdio.h>int main() {int arr[10];// 输入数组元素printf("请输入10个整数:\n");for(int i = 0; i < 10; i++) {scanf("%d", &arr[i]);}// 输出数组元素printf("数组内容为:");for(int i = 0; i < 10; i++) {printf("%d ", arr[i]);}return 0;
}

4、补充注意事项

  1. 数组越界访问:C语言不检查数组边界,访问arr[-1]arr[10](对于大小为10的数组)会导致未定义行为

  2. 数组大小计算:可以使用sizeof运算符获取数组总字节数:sizeof(arr)

  3. 元素个数计算sizeof(arr) / sizeof(arr[0])

  4. 变长数组:C99支持变长数组(VLA),但大小一旦确定就不能改变

int n = 10;
int vla[n];  // 变长数组,大小由变量n决定

四、数组在内存中的存储及元素个数计算

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

        通过前面的学习,我们已经能够熟练使用数组了。为了更深入地理解数组,我们需要了解数组在内存中的存储方式。

让我们通过以下代码来观察数组元素的地址分布:

#include <stdio.h>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("&arr[%d] = %p\n", i, &arr[i]);}return 0;
}

运行这段代码后,我们会发现:

  1. 随着数组下标的增加,元素的地址呈现由小到大的变化规律

  2. 每两个相邻元素之间的地址差值为4(因为一个整型占4个字节)

        x64 表示是64位的环境,在64位的环境中地址是64bit位的,所以就比较长;我们可以切换到x86,也就是32位环境,地址会短一点,容易观察,如上图。

重要结论

        数组在内存中是连续存储的。这一特性为后续使用指针访问数组元素奠定了基础(指针相关内容将在后续章节详细讲解)。

2、使用sizeof计算数组元素个数

        在实际编程中,我们经常需要知道数组的元素个数。C语言提供了使用sizeof运算符来计算数组元素个数的方法。

sizeof运算符简介

    sizeof是C语言中的一个关键字,用于计算类型或变量所占内存空间的大小(以字节为单位)。对于数组,sizeof可以计算整个数组所占的内存空间大小。我们知道数组中的所有元素类型相同,因此只需计算单个元素的字节大小,就能确定数组的元素个数。这里直接以第一个元素的大小作为基准即可。

示例:

#include <stdio.h>int main()
{int arr[10] = {0};printf("%d\n", sizeof(arr));  // 输出整个数组的大小//上面这句会输出40,因为数组包含10个int类型元素,每个int占4字节,总共是40字节。printf("%d\n", sizeof(arr[0]));//计算⼀个元素的⼤⼩,单位是字节return 0;
}

计算数组元素个数

        由于数组中所有元素的类型相同,我们可以通过以下公式计算数组元素个数:数组元素个数 = 数组总大小 / 单个元素大小

实现代码:

#include <stdio.h>int main()
{int arr[10] = {0};int sz = sizeof(arr) / sizeof(arr[0]);  // 计算元素个数printf("%d\n", sz);  // 输出10return 0;
}

优点

        这种方法使得代码更加灵活,当数组大小改变时,不需要手动修改所有相关代码,计算结果会自动适应数组的变化。

http://www.xdnf.cn/news/1289341.html

相关文章:

  • “生成式UI革命”:Tambo AI如何让你的应用“开口说话、动手搭界面” | 全面深剖、案例实践与未来展望
  • Python函数篇:从零到精通
  • ubuntu24下keychorn键盘连接不了的改建页面的问题修复
  • 每日任务day0812:小小勇者成长记之挤牛奶
  • 10-docker基于dockerfile自动制作镜像
  • 熟悉并使用Spring框架 - 注解篇
  • golang的继承
  • 【Python办公】Mermaid代码转图片工具 - Tkinter GUI版本
  • NY198NY203美光固态闪存NY215NY216
  • Android 项目:画图白板APP开发(一)——曲线优化、颜色、粗细、透明度
  • OpenHarmony编译与烧录
  • 1小时 MySQL 数据库基础速通
  • 服务端配置 CORS解决跨域问题的原理
  • 安卓主题定制实践:17.45MB轻量级主题引擎技术解析
  • LDAP 登录配置参数填写指南
  • WireShark:非常好用的网络抓包工具
  • 间隙锁(Gap Lock)
  • 力扣top100(day01-05)--矩阵
  • 【自动化备份全网服务器数据项目】
  • TF-IDF——红楼梦案例
  • 2025年渗透测试面试题总结-15(题目+回答)
  • 前端css学习笔记3:伪类选择器与伪元素选择器
  • VUE+SPRINGBOOT从0-1打造前后端-前后台系统-会议记录
  • Cookies和Sessions
  • 晓知识: 如何理解反射
  • Seed-VC:零样本语音转换与扩散transformer
  • 启保停-----------单相照明灯的接法
  • 【数据库】 MySQL 表的操作详解
  • 编程模型设计空间的决策思路
  • 贪心----4.划分字母区间