c语言-----数组

  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]);  // 输出第二行第三列的元素7return 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.mzph.cn/bicheng/64594.shtml

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

相关文章

【最新攻略】腾讯云双十一最强攻略密码

引言一起来薅羊毛准备工作双人成团PK有大礼! 福利总结 引言 腾讯云&#xff08;Tencent Cloud&#xff09;想必大家都听说过吧&#xff1f;腾讯云是腾讯提供的“云计算”服务。你可以把它想成一个超级强大的网络平台&#xff0c;帮助公司和开发者把自己的技术、数据、网站等东西…

【C#】List求并集、交集、差集

值类型List List<int> intList1 new List<int>() { 1, 2, 3 };List<int> intList2 new List<int>() { 3, 4, 5 };var result intList1.Union(intList2);Console.WriteLine($"并 {string.Join(,,result)}");result intList1.Intersect(in…

游戏渠道假量解决方案

某推广公司在推广过程中被查出“短期内点击量激增”“存在同一地址多次访问”“已注册用户重复注册”等数据作弊行为&#xff0c;法院判罚退还服务费200余万元&#xff0c;并赔偿违约金约350万元。 某公司为提升其游戏在应用商店榜单排名&#xff0c;委托某网络公司进行下载、注…

【Linux运维】配置ssh免密登录

1.场景描述 内网环境&#xff0c;需要同步17服务器的文件到10服务器进行备份。因为每次输入密码比较繁琐&#xff0c;如果实现免密登录后&#xff0c;即可简化脚本。 要求&#xff1a;需要2台服务器-免密登录 2.方案分析 &#xff08;1&#xff09;现状&#xff1a;登录需要输…

Android实现RecyclerView边缘渐变效果

Android实现RecyclerView边缘渐变效果 1.前言&#xff1a; 是指在RecyclerView中实现淡入淡出效果的边缘效果。通过这种效果&#xff0c;可以使RecyclerView的边缘在滚动时逐渐淡出或淡入&#xff0c;以提升用户体验。 2.Recyclerview属性&#xff1a; 2.1、requiresFading…

C语言——实现找出最高分

问题描述&#xff1a;分别有6名学生的学号、姓名、性别、年龄和考试分数&#xff0c;找出这些学生当中考试成绩最高的学生姓名。 //找出最高分#include<stdio.h>struct student {char stu_num[10]; //学号 char stu_name[10]; //姓名 char sex; //性别 int age; …

Kafka Streams 在监控场景的应用与实践

作者&#xff1a;来自 vivo 互联网服务器团队- Pang Haiyun 介绍 Kafka Streams 的原理架构&#xff0c;常见配置以及在监控场景的应用。 一、背景 在当今大数据时代&#xff0c;实时数据处理变得越来越重要&#xff0c;而监控数据的实时性和可靠性是监控能力建设最重要的一环…

作业Day4: 链表函数封装 ; 思维导图

目录 作业&#xff1a;实现链表剩下的操作&#xff1a; 任意位置删除 按位置修改 按值查找返回地址 反转 销毁 运行结果 思维导图 作业&#xff1a;实现链表剩下的操作&#xff1a; 1>任意位置删除 2>按位置修改 3>按值查找返回地址 4>反转 5>销毁 任意…

省略内容在句子中间

一、使用二分查找法 每次查找时&#xff0c;将查找范围分成两半&#xff0c;并判断目标值位于哪一半&#xff0c;从而逐步缩小查找范围。 循环查找 计算中间位置 mid Math.floor((low high) / 2)。比较目标值 target 和中间位置的元素 arr[mid]&#xff1a; 如果 target ar…

IDEA中解决Edit Configurations中没有tomcat Server选项的问题

今天使用IDEA2024专业版的时候,发现Edit Configurations里面没有tomcat Server,最终找到解决方案。 一、解决办法 1、打开Settings 2、搜索tomcat插件 搜索tomcat插件之后,找到tomcat 发现tomcat插件处于未勾选状态,然后我们将其勾选保存即可。 二、结果展示 最后,再次编…

UE5中实现Billboard公告板渲染

公告板&#xff08;Billboard&#xff09;通常指永远面向摄像机的面片&#xff0c;游戏中许多技术都基于公告板&#xff0c;例如提示拾取图标、敌人血槽信息等&#xff0c;本文将使用UE5和材质节点制作一个公告板。 Gif效果&#xff1a; 网格效果&#xff1a; 1.思路 通过…

LabVIEW在电液比例控制与伺服控制中的应用

LabVIEW作为一种图形化编程环境&#xff0c;广泛应用于各类控制系统中&#xff0c;包括电液比例控制和伺服控制领域。在这些高精度、高动态要求的控制系统中&#xff0c;LabVIEW的优势尤为突出。以下从多个角度探讨其应用与优势&#xff1a; ​ 1. 灵活的控制架构 LabVIEW为电…

《深入浅出Apache Spark》系列⑤:Spark SQL的表达式优化

导读&#xff1a;随着数据量的快速增长&#xff0c;传统的数据处理方法难以满足对计算速度、资源利用率以及查询响应时间的要求。为了应对这些挑战&#xff0c;Spark SQL 引入了多种优化技术&#xff0c;以提高查询效率&#xff0c;降低计算开销。本文从表达式层面探讨了 Spark…

unity webgl部署到iis报错

Unable to parse Build/WebGLOut.framework.js.unityweb! The file is corrupt, or compression was misconfigured? (check Content-Encoding HTTP Response Header on web server) iis报错的 .unityweb application/octet-stream iis中添加 MIME类型 .data applicatio…

CXF WebService SpringBoot 添加拦截器,处理响应报文格式

描述 XFIRE升级CXF框架&#xff0c;但是对接的系统不做调整&#xff0c;这时候就要保证参数报文和响应报文和以前是一致的。但是不同的框架有不同的规则&#xff0c;想要将报文调整的一致&#xff0c;就需要用到拦截器拦截报文&#xff0c;自定义解析处理。 CXF框架本身就是支…

基于Spring Boot的雅苑小区管理系统

一、系统背景与意义 随着信息化技术的快速发展&#xff0c;传统的小区物业管理方式已经难以满足现代居民对于高效、便捷服务的需求。因此&#xff0c;开发一款基于Spring Boot的小区管理系统显得尤为重要。该系统旨在通过信息化手段&#xff0c;实现小区物业管理的智能化、自动…

Docke_常用命令详解

这篇文章分享一下笔者常用的Docker命令供各位读者参考。 为什么要用Docker? 简单来说&#xff1a;Docker通过提供轻量级、隔离且可移植的容器化环境&#xff0c;使得应用在不同平台上保持一致性、易于部署和管理&#xff0c;具体如下 环境一致性&#xff1a; Docker容器使得…

Ubuntu 20.04下Kinect2驱动环境配置与测试【稳定无坑版】

一、引言 微软Kinect2传感器作为一个包含深度传感器、RGB摄像头以及红外摄像头的多模态采集设备&#xff0c;在计算机视觉、机器人感知、人体姿态识别、3D建模等领域有着广泛应用。相比第一代Kinect&#xff0c;Kinect2拥有更好的深度分辨率和更高的数据质量。本文将详细介绍如…

Flask入门:打造简易投票系统

目录 准备工作 创建项目结构 编写HTML模板 编写Flask应用 代码解读 进一步优化 结语 Flask,这个轻量级的Python Web框架,因其简洁和易用性,成为很多开发者入门Web开发的首选。今天,我们就用Flask来做一个简单的投票系统,让你快速上手Web开发,同时理解Flask的核心概…

Cadence学习笔记 9 器件封装匹配

基于Cadence 17.4&#xff0c;四层板4路HDMI电路 更多Cadence学习笔记&#xff1a;Cadence学习笔记 1 原理图库绘制Cadence学习笔记 2 PCB封装绘制Cadence学习笔记 3 MCU主控原理图绘制Cadence学习笔记 4 单片机原理图绘制Cadence学习笔记 5 四路HDMI原理图绘制Cadence学习笔记…