c语言-----数组

news2024/12/20 12:23:28
  1. 基本概念

    • 数组是C语言中一种用于存储多个相同类型数据的数据结构。这些数据在内存中是连续存储的,可以通过索引(下标)来访问数组中的各个元素。数组的索引从0开始,这是C语言的规定。例如,一个有n个元素的数组,其索引范围是从0到n - 1
      在这里插入图片描述
  2. 一维数组

    • 定义和初始化
      • 定义方式
        • 数据类型 数组名[数组大小];
        • 例如:int arr[5];,这就定义了一个名为arr的整型数组,它可以存储5个整数。
      • 初始化方法
        • 可以在定义数组时进行初始化。例如:int arr[5] = {1, 2, 3, 4, 5};,将数组arr的5个元素分别初始化为1、2、3、4、5。
        • 如果初始化时提供的初始值个数少于数组大小,剩下的元素会被自动初始化为0(对于数值类型)或\0(对于字符数组)。例如:int arr[5] = {1, 2};,则arr[2]arr[3]arr[4]会被初始化为0。
        • 也可以省略数组大小,让编译器根据初始值的个数来确定数组大小。例如:int arr[] = {1, 2, 3};,此时数组arr的大小为3。
    • 元素访问
      • 通过索引访问数组元素,格式为数组名[索引]。例如,对于前面定义的arr数组,arr[0]表示第一个元素,其值为1;arr[3]表示第四个元素,其值为4。
    • 示例代码 - 计算一维数组元素的平均值
#include <stdio.h>
int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    int sum = 0;
    for (int i = 0; i < 5; i++) {
        sum += arr[i];
    }
    double average = (double)sum / 5;
    printf("数组元素的平均值为:%lf\n", average);
    return 0;
}
 - **解释**:
   - 首先定义并初始化了一个包含5个整数的数组`arr`。然后通过一个`for`循环,从索引0到4遍历数组,将每个元素的值累加到变量`sum`中。最后计算平均值,将`sum`转换为双精度浮点数后除以元素个数5,并将结果存储在`average`变量中,通过`printf`函数输出平均值。
  1. 二维数组
    • 定义和初始化
      • 定义方式
        • 数据类型 数组名[行数][列数];
        • 例如:int matrix[3][4];,定义了一个名为matrix的二维整型数组,它有3行4列,总共可以存储3 * 4 = 12个整数。
      • 初始化方法
        • 按行初始化。例如:int matrix[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};,这是最直观的初始化方式,将数组的每一行用花括号括起来,分别初始化每一行的元素。
        • 也可以省略第一维(行数)的大小,让编译器根据初始化值的行数来确定。例如:int matrix[][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}};,此时编译器会根据提供的两行初始化值确定数组有2行。
    • 元素访问
      • 通过两个索引来访问元素,格式为数组名[行索引][列索引]。例如,对于前面定义的matrix数组,matrix[1][2]表示第二行(索引从0开始,所以是1)第三列(索引从0开始,所以是2)的元素,其值为7。
    • 示例代码 - 打印二维数组
#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;
}
 - **解释**:
   - 定义并初始化了一个`3x4`的二维数组`matrix`。然后使用嵌套的`for`循环来访问数组元素。外层`for`循环控制行数,从0到2;内层`for`循环控制列数,从0到3。在每次内层循环中,通过`printf`函数输出当前元素的值,并在每个元素后添加一个空格。每一行的元素输出完后,通过`printf("\n")`换行,最终打印出整个二维数组。
  1. 字符数组和字符串
    • 字符数组的定义和初始化
      • 定义方式与其他数组类似。例如:char str[10];,定义了一个可以存储10个字符的字符数组。
      • 初始化可以直接赋值字符。例如:char str[5] = {'H', 'e', 'l', 'l', 'o'};,这就将字符数组str的前5个元素分别初始化为Hello
    • 字符串的概念和存储
      • 在C语言中,字符串是以\0(空字符)结尾的字符序列。当把一个字符串赋值给字符数组时,编译器会自动在字符串末尾添加\0。例如:char str[] = "Hello";,这个字符数组实际上存储了Hello\0\0用于标记字符串的结束。
    • 字符串处理函数
      • strcpy()函数:用于将一个字符串复制到另一个字符数组中。例如:char str1[10], str2[] = "World"; strcpy(str1, str2);,这就将str2中的字符串复制到了str1中。
      • strcat()函数:用于将一个字符串连接到另一个字符数组中的字符串后面。例如:char str1[20] = "Hello"; char str2[] = " World"; strcat(str1, str2);,结果str1中的字符串变为Hello World
      • strlen()函数:用于计算字符串的长度(不包括\0)。例如:char str[] = "Hello"; int len = strlen(str);,则len的值为5。
        以下是关于C语言数组的详细介绍:

一维数组

  • 创建与初始化
    • 创建格式为type_t arr_name[const_n];,其中type_t是数组元素类型,const_n是常量表达式,用于指定数组大小。例如int arr[5];创建了一个包含5个int类型元素的数组.
    • 初始化有多种方式,如下表所示:
      |初始化方式|示例|说明|
      在这里插入图片描述

|完全初始化|int arr[5] = {1, 2, 3, 4, 5};|数组的每个元素都被明确赋值|
|不完全初始化|int arr[5] = {1, 2, 3};|只初始化了前三个元素,剩余元素默认初始化为0|
|省略数组长度初始化|int arr[] = {1, 2, 3, 4};|编译器根据初始化元素的个数确定数组长度为4|

  • 内存布局:一维数组在内存中是连续存储的,每个元素之间的地址差是sizeof(element_type)个字节,其中element_type是数组元素的数据类型。例如,对于int arr[5],假设arr[0]的地址是0x1000,那么arr[1]的地址是0x1000 + sizeof(int),以此类推.
  • 数组名的含义:数组名在大多数情况下代表数组的首地址,是一个常量指针。但在sizeof操作符中,sizeof(arr)计算的是整个数组的大小;在&arr操作中,得到的是整个数组的地址.
  • 遍历方式:通常使用for循环遍历一维数组,如下所示:
#include <stdio.h>

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    for (int i = 0; i < 5; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

也可以使用指针的方式遍历,如下所示:

#include <stdio.h>

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    int *p = arr;
    for (int i = 0; i < 5; i++) {
        printf("%d ", *p);
        p++;
    }
    return 0;
}
  • 作为函数参数:当一维数组作为函数参数传递时,实际上传递的是数组的首地址,函数中对数组的操作会影响到原始数组。例如:
#include <stdio.h>

void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
}

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    printArray(arr, sizeof(arr) / sizeof(arr[0]));
    return 0;
}

二维数组

  • 创建与初始化 :
    • 创建格式为type_t arr_name[num_rows][num_cols];,例如int arr[3][4];创建了一个包含3行4列共12个int类型元素的二维数组。
    • 初始化方式如下表所示:
      |初始化方式|示例|说明|

|按行初始化全部元素|int arr[2][3] = { {1, 2, 3}, {4, 5, 6} };|明确地为每一行的元素赋值|
|部分初始化|int arr[3][4] = { {1, 2}, {5, 6, 7} };|第一行前两个元素初始化为1和2,其余自动为0;第二行前三个元素初始化为5、6、7,第四个元素自动为0|
|完全由0组成的数组|int arr[3][4] = {0};|所有元素都初始化为0|
|省略行初始化|int arr[][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} };|编译器根据初始化列值的数量计算数组的行数|

  • 内存布局:二维数组在内存中也是连续存储的,同一行的元素地址相差sizeof(element_type)个字节,不同行首元素之间的地址差为num_cols * sizeof(element_type) ,其中num_cols是二维数组的列数,element_type是数组元素的数据类型.
  • 使用方式:通过下标来访问二维数组元素,第一个下标表示行,第二个下标表示列,且下标均从0开始。例如:
#include <stdio.h>

int main() {
    int arr[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} };
    printf("%d\n", arr[1][2]);  // 输出第二行第三列的元素7
    return 0;
}

同样可以使用嵌套的for循环遍历二维数组,如下所示:

#include <stdio.h>

int main() {
    int arr[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 ", arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}
  • 作为函数参数:二维数组作为函数参数时,函数形参的声明可以指定第二维的大小,第一维的大小可以省略,但在函数内部访问数组元素时,需要确保不越界。例如:
#include <stdio.h>

void print2DArray(int arr[][4], int num_rows) {
    for (int i = 0; i < num_rows; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
}

int main() {
    int arr[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} };
    print2DArray(arr, 3);
    return 0;
}

字符数组

  • 创建与初始化:字符数组的创建方式与其他类型的数组类似,例如char str[10];创建了一个包含10个字符元素的字符数组。初始化可以使用字符常量逐个初始化,也可以使用字符串常量初始化,如下表所示:
    |初始化方式|示例|说明|
    在这里插入图片描述

|逐个字符初始化|char str[5] = {'h', 'e', 'l', 'l', 'o'};|明确地为每个字符元素赋值|
|使用字符串常量初始化|char str[6] = "hello";|使用字符串常量初始化字符数组,字符串末尾会自动添加’\0’作为结束标志|

  • 特殊之处:由于字符串是以’\0’作为结束标志的字符序列,所以在处理字符数组时,需要注意字符串操作函数对’\0’的依赖。例如,strlen函数用于计算字符串的长度,不包括’\0’;而sizeof函数计算的是字符数组的大小,包括’\0’.
  • 常用操作:常见的字符数组操作包括字符串复制、连接、比较等,C语言提供了相应的标准库函数来实现这些操作,如strcpystrcatstrcmp等。例如:
#include <stdio.h>
#include <string.h>

int main() {
    char str1[10] = "hello";
    char str2[10];
    strcpy(str2, str1);
    printf("%s\n", str2);

    char str3[20] = "world";
    strcat(str1, str3);
    printf("%s\n", str1);

    int result = strcmp(str1, "helloworld");
    if (result == 0) {
        printf("两个字符串相等\n");
    } else {
        printf("两个字符串不相等\n");
    }

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2262707.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

社区版 IDEA 开发webapp 配置tomcat

1.安装tomcat 参考Tomcat配置_tomcat怎么配置成功-CSDN博客 2.构建webapp项目结构 新建一个普通项目 然后添加webapp的目录结构&#xff1a; main目录下新建 webapp 文件夹 webapp文件夹下新建WEB_INF文件夹 *WEB_INF目录下新建web.xml wenapp文件夹下再新建index.html …

全面解析 Kubernetes 流量负载均衡:iptables 与 IPVS 模式

目录 Kubernetes 中 Service 的流量负载均衡模式 1. iptables 模式 工作原理 数据路径 优点 缺点 适用场景 2. IPVS 模式 工作原理 数据路径 优点 缺点 适用场景 两种模式的对比 如何切换模式 启用 IPVS 模式 验证模式 总结 Kubernetes 中 Service 的流量负载…

C 语言数据类型详解

目录 一、引言 二、基本数据类型 &#xff08;一&#xff09;整型 &#xff08;二&#xff09;浮点型 &#xff08;三&#xff09;字符型 三、构造数据类型 &#xff08;一&#xff09;数组 &#xff08;二&#xff09;结构体 &#xff08;三&#xff09;联合体&#…

Python图注意力神经网络GAT与蛋白质相互作用数据模型构建、可视化及熵直方图分析...

全文链接&#xff1a;https://tecdat.cn/?p38617 本文聚焦于图注意力网络GAT在蛋白质 - 蛋白质相互作用数据集中的应用。首先介绍了研究背景与目的&#xff0c;阐述了相关概念如归纳设置与转导设置的差异。接着详细描述了数据加载与可视化的过程&#xff0c;包括代码实现与分析…

LeetCode 1925 统计平方和三元组的数目

探索平方和三元组&#xff1a;从问题到 Java 代码实现 在数学与编程的交叉领域&#xff0c;常常会遇到一些有趣且富有挑战性的问题。今天&#xff0c;就让我们深入探讨一下 “平方和三元组” 这个有趣的话题&#xff0c;并使用 Java 语言来实现计算满足特定条件的平方和三元组…

回归预测 | MATLAB实现CNN-BiGRU-Attention卷积神经网络结合双向门控循环单元融合注意力机制多输入单输出回归预测

回归预测 | MATLAB实现CNN-BiGRU-Attention卷积神经网络结合双向门控循环单元融合注意力机制多输入单输出回归预测 目录 回归预测 | MATLAB实现CNN-BiGRU-Attention卷积神经网络结合双向门控循环单元融合注意力机制多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效…

vue横向滚动日期选择器组件

vue横向滚动日期选择器组件 组件使用到了element-plus组件库和dayjs库&#xff0c;使用前先保证项目中已经下载导入 主要功能&#xff1a;选择日期&#xff0c;点击日期可以让此日期滚动到视图中间&#xff0c;左滑右滑同理&#xff0c;支持跳转至任意日期&#xff0c;支持自…

Firecrawl教程①:自动化抓取与数据转化,赋能AI应用

Firecrawl教程①:自动化抓取与数据转化,赋能AI应用 前言一、功能特点1. 支持 LLM 可处理的数据格式2. 全面抓取网站3. 强大的操作支持4. 灵活的定制选项5. 支持多种编程语言 SDK二、如何开始使用 Firecrawl第一步:获取 API 密钥第二步:官网在线工具使用第三步:安装 Firecr…

WatchAlert - 开源多数据源告警引擎

概述 在现代 IT 环境中&#xff0c;监控和告警是确保系统稳定性和可靠性的关键环节。然而&#xff0c;随着业务规模的扩大和数据源的多样化&#xff0c;传统的单一数据源告警系统已经无法满足复杂的需求。为了解决这一问题&#xff0c;我开发了一个开源的多数据源告警引擎——…

svn版本丢失导致无法访问临时解决方法

#svn异常问题# 在使用svn的过程中&#xff0c;有时候在数据量比较大的情况下&#xff0c;有涉及到数据迁移或者是文件移动操作时容易出现迁移过程中有人还提交了数据&#xff0c;导致迁移的数据出现版本丢失的情况。 比如说&#xff0c;我实际遇到的情况是迁移数据的时候记录…

0009.基于springboot+layui的ERP企业进销存管理系统

一、系统说明 基于springbootlayui的ERP企业进销存管理系统,系统功能齐全, 代码简洁易懂&#xff0c;适合小白学编程,课程设计&#xff0c;毕业设计。 二、系统架构 前端&#xff1a;html| layui 后端&#xff1a;springboot | mybatis| thymeleaf 环境&#xff1a;jdk1.8 |…

Latex+VsCode+Win10搭建

最近在写论文&#xff0c;overleaf的免费使用次数受限&#xff0c;因此需要使用本地的形式进行编译。 安装TEXLive 下载地址&#xff1a;https://mirror-hk.koddos.net/CTAN/systems/texlive/Images/ 下载完成直接点击iso进行安装操作。 安装LATEX Workshop插件 设置VsCode文…

[创业之路-199]:《华为战略管理法-DSTE实战体系》- 3 - 价值转移理论与利润区理论

目录 一、价值转移理论 1.1. 什么是价值&#xff1f; 1.2. 什么价值创造 &#xff08;1&#xff09;、定义 &#xff08;2&#xff09;、影响价值创造的因素 &#xff08;3&#xff09;、价值创造的三个过程 &#xff08;4&#xff09;、价值创造的实践 &#xff08;5&…

如何在单选按钮中添加图标和文字

文章目录 1. 概念介绍2. 使用方法3. 示例代码我们在上一章回中介绍了Radio Widget相关的内容,本章回中将介绍RadioListTile Widget.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在这里介绍的RadioListTile和上一章回中介绍的Radio类似,不同之处在于RadioListTile组…

启动异常:Caused by: java.lang.IllegalStateException: Failed to introspect Class

背景 今天项目需要&#xff0c;导入一个本地的jar包&#xff0c;在pom文件&#xff0c;添加自定义依赖后&#xff0c;并通过mvn命令&#xff1a; mvn install:install-file -Dfilejar包的位置 -DgroupId自定义的groupId -DartifactId自定义的artifactId -Dversion自定义的ver…

clickhouse-副本和分片

1、副本 1.1、概述 集群是副本和分片的基础&#xff0c;它将ClickHouse的服务拓扑由单节点延伸到多个节点&#xff0c;但它并不像Hadoop生态的某些系统那样&#xff0c;要求所有节点组成一个单一的大集群。ClickHouse的集群配置非常灵活&#xff0c;用户既可以将所有节点组成…

Python机器学习算法KNN、MLP、NB、LR助力油气钻井大数据提速参数优选及模型构建研究...

全文链接&#xff1a;https://tecdat.cn/?p38601 分析师&#xff1a;Huayan Mu 随着机器学习和大数据分析技术的发展&#xff0c;帮助客户进行油气行业数字化转型势在必行&#xff0c;钻井提速参数优选呈现由经验驱动、逻辑驱动向数据驱动转变的趋势。机械钻速最大化、机械比能…

【尚硅谷 - SSM+SpringBoot+SpringSecurity框架整合项目 】项目打包并且本地部署

前后端分离开发&#xff1a;把一个项目拆成两部分进行开发&#xff0c;所以在打包的时候&#xff0c;需要使用不同的打包方式。 后端 – SpringBoot – jar包 前端 – Vue: 因为使用了vue-admin-template框架&#xff1a;所以先使用框架进行打包使用Nginx部署&#xff0c;通…

练13:二分法

欢迎大家订阅【蓝桥杯Python每日一练】 专栏&#xff0c;开启你的 Python数据结构与算法 学习之旅&#xff01; 文章目录 1 二分查找2 例题分析 1 二分查找 ①定义 在计算机科学中&#xff0c;二分算法&#xff08;Binary Search&#xff09;是一种高效的查找算法&#xff0c;…

Android Studio更改项目使用的JDK

一、吐槽 过去&#xff0c;在安卓项目中配置JDK和Gradle的过程非常直观&#xff0c;只需要进入Android Studio的File菜单中的Project Structure即可进行设置&#xff0c;十分方便。 原本可以在这修改JDK: 但大家都知道&#xff0c;Android Studio的狗屎性能&#xff0c;再加…