一维数组和二维数组的使用(char类型)

目录

  • 导读
  • 1. 字符数组
    • 1.1 字符数组的创建
    • 1.2 字符数组的初始化
    • 1.3 不同初始化在内存中的不同
      • 1.3.1 strlen测试
      • 1.3.2 sizeof测试
      • 1.3.3 差异原因
    • 1.4 字符数组的使用
  • 2. 数组越界
  • 3. 数组作为函数参数
  • 博主有话说

导读

我们在前面讲到了 int 类型的数组的创建和使用:
一维数组和二维数组的使用(int类型)
今天我们来了解字符数组的创建和使用,还会提到关于数组越界的问题和数组作为函数参数的用法。
这里还有个基于数组而制作的小游戏——三子棋,感兴趣的小伙伴可以进去看一下。

1. 字符数组

我们在剖析数据在内存中的存储中介绍到:

字符型数据是以字符的ASCII代码存储在存储单元中的,一般占一个字节。由于ASCII代码也属于整数形式,因此在C99标准中,把字符类型归纳为整型类型中。

C语言中没有字符串类型,也没有字符串变量,字符串是存放在字符型数组中的。

1.1 字符数组的创建

用来存放字符数据的数组是字符数组
一维数组:

 char arr[10];//一维数组// 定义了一个大小为10的字符数组

二维数组:

 char arr[3][5];//创建一个3行5列的二维字符数组

1.2 字符数组的初始化

数组在创建的时候如果想不指定数组的确定的大小就得初始化。数组的元素个数根据初始化的内容来确定。

char arr1[3] = {'a',98, 'c'};
char arr2[] = {'a','b','c'};
char arr3[] = "abc";
char arr[3][10] = {"hello", "world", "c"};

1.3 不同初始化在内存中的不同

但是对于下面的代码要区分,内存中如何分配。

char arr2[] = {'a','b','c'};
char arr3[] = "abc";

1.3.1 strlen测试

我们可以用strlen函数来进行测试,strlen函数是用来计算字符串的长度的,计算的是实际长度,不包括 ’ \0 ’ 在内

int main()
{char arr2[] = { 'a','b','c' };char arr3[] = "abc";int len1 = strlen(arr2);int len2 = strlen(arr3);printf("arr2字符串长度:%d\narr3字符串长度:%d\n", len1, len2);return 0;
}

在这里插入图片描述
可以看到第一个和第二个字符串长度的差异,这就是两者的区别

1.3.2 sizeof测试

int main()
{char arr2[] = { 'a','b','c' };char arr3[] = "abc";int sz1 = sizeof(arr2);int sz2 = sizeof(arr3);printf("arr2字符串大小:%d\narr3字符串大小:%d\n", sz1, sz2);return 0;
}

在这里插入图片描述

1.3.3 差异原因

arr2[] 和 arr3[] 存储的东西是相同的,也就是一组字符的集合,但是它们在内存中存储的方式不同,这也就导致了它们在使用上的一些细微差别。

  1. 对于arr2[]来说,它是一个字符数组,也就是一组字符的集合,每个字符都占用一个字节的空间。在内存中,它是连续存储的,因此每个字符都有自己的地址。
  2. 对于arr3[]来说,它是一个以null结尾的字符串,也就是一组字符的集合,每个字符仍然占用一个字节的空间。但是,在内存中,它不同于arr2[],它会在字符串的结尾处添加一个null(‘\0’)字符来表示字符串的结束。因此,在内存中,它需要额外的一个字节来存储null字符,也就是说,字符串"abc"在内存中占用4个字节的空间。

在这里插入图片描述
在这里插入图片描述

1.4 字符数组的使用

一维字符数组:

int main() {char name[] = { 'J', 'o', 'h', 'n', '\0' }; // 注意要以 '\0' 结束int length = sizeof(name) / sizeof(name[0]); // 计算数组长度for (int i = 0; i < length; i++) {printf("%c ", name[i]);}return 0;
}

在这里插入图片描述

二维字符数组:

int main() {// 定义二维字符数组char arr[3][10] = { "hello", "world", "c" };// 输出二维字符数组for (int i = 0; i < 3; ++i) {printf("%s\n", arr[i]);}return 0;
}

在这里插入图片描述

2. 数组越界

数组的下标是有范围限制的。
数组的下规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。
所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。
C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的,
所以程序员写代码时,最好自己做越界的检查。

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("%d ", arr[i]);//当i等于10的时候,越界访问了}return 0;
}

在这里插入图片描述
这种问题会导致程序出现运行时错误,通常会导致程序崩溃、异常或错误的输出。

3. 数组作为函数参数

往往我们在写代码的时候,会将数组作为参数传个函数
比如:我要实现一个冒泡排序函数
判断下面代码是否能够实现排序

void bubble_sort(int arr[])
{int sz = sizeof(arr) / sizeof(arr[0]);int i = 0;for (i = 0; i < sz - 1; i++){int j = 0;for (j = 0; j < sz - i - 1; j++){if (arr[j] > arr[j + 1]){int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}
}
int main()
{int arr[] = { 3,1,7,5,8,9,0,2,4,6 };bubble_sort(arr);//是否可以正常排序?int i = 0;for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){printf("%d ", arr[i]);}return 0;
}

在这里插入图片描述
结构并没有帮助我们实现排序,我们来进入调试查看
查看两个值:
在这里插入图片描述
接下来进入排序函数:
在这里插入图片描述
调试之后可以看到bubble_sort 函数内部的sz 是1,原因就在于我们传递过去的是数组的首元素地址,bubble_sort 函数内部的sz计算的也仅仅是首元素的大小,所以正确代码应该为:

void bubble_sort(int arr[], int sz)//参数接收数组元素个数
{int i = 0;for (i = 0; i < sz - 1; i++){int j = 0;for (j = 0; j < sz - i - 1; j++){if (arr[j] > arr[j + 1]){int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}
}
int main()
{int arr[] = { 3,1,7,5,8,9,0,2,4,6 };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz);int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}

博主有话说

关于更多的数组对于sizeof和strlen函数传参的问题可以看——不同的数组传参在sizeof和strlen中的不同
今天就到这里,关注博主查看更多内容

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

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

相关文章

Mysql分库分表

1.原理 2.Sharding JDBC 官网https://shardingsphere.apache.org/ 2.1 水平拆分 创建一个新的springboot项目 导入依赖,直接将原本的dependencies给覆盖掉 <dependencies><!-- ShardingJDBC依赖 --><dependency><groupId>org.apache.shardings…

springmvc-controller视图层配置SpringMVC处理请求的流程

目录 1. 什么是springmvc 2.项目中加入springmvc支持 2.1 导入依赖 2.2 springMVC配置文件 2.3 web.xml配置 2.4 中文编码处理 3. 编写一个简单的controller 4. 视图层配置 4.1 视图解析器配 4.2 静态资源配置 4.2 编写页面 4.3 页面跳转方式 5. SpringMVC处理请求…

【物联网】常见电子元器件(电阻、电容、电感、二极管、三极管)综合,详细分析原理及其应用

电子元器件是现代电子技术的基础&#xff0c;它们在各个领域中发挥着重要作用。从三极管到电容器、电阻器&#xff0c;这些常用元器件承担着放大、开关、滤波等关键任务。它们的特性和组合方式决定了电路的性能和功能。本文将介绍常用电子元器件的工作原理和应用场景&#xff0…

zkLogin构建者的最佳实践和业务思考

随着zkLogin在Sui主网上线&#xff0c;构建者可以开始为其应用程序提供丝滑的帐户创建服务。与任何新技术集成一样&#xff0c;构建者需要考虑许多重要的问题&#xff0c;以降低风险并成功优化。 本文概述了其中一些考虑因素&#xff0c;并突出了zkLogin文档中提供的明确指导。…

vue3 - 使用 xlsx 库将数据导出到 Excel 文件

GitHub Demo 地址 在线预览 xlsx是由SheetJS开发的一个处理excel文件的JavaScript库。它可以读取、编写和操作 Excel 文件 安装xlsx npm install xlsx --save实现一个通过的数据导出工具类 import * as XLSX from xlsx/*** description: 导出excel* param {any} dataList* p…

基于SSM的微博系统网站的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

phpstudy_pro高效率建一个属于自己的网站

1.下载phpStudy_32 2.下载wordpress-6.3-zh_CN 安装好phpstudy后启动phpstudy中对应的服务&#xff0c;并在网站中配置好对一个的应用的路径 ps:根目录中的路径是你想要通过phpstudy部署应用的路径 这里以wordpress为例 将下载wordpress的压缩包解压后&#xff0c;需要修改…

前端页面初步开发

<template><div><el-card class"box-card" style"height: 620px"><el-input v-model"query.name" style"width:200px" placeholder"请输入用户姓名"></el-input>&nbsp&nbsp&nbsp…

【Golang】数组 切片

【Golang】数组 && 切片 1、数组 基本概念 数组是一个由固定长度的特定类型元素组成的序列&#xff0c;一个数组可以由零个或多个元素组成 因为数组的长度是固定的&#xff0c;所以在Go语言中很少直接使用数组 数组初始化 //1、默认数组中的值是类型的默认值 var arr…

Pycharm操作git仓库 合并等

菜单 Git CommitPushUpdate ProjectPullFetchMergreRebase 查询 查询分支 查询本地所有分支 # 查询本地分支 git branch# 查询远程分支 git branch -rPycharm查看当前分支 步骤&#xff1a; Git->Branches 哈喽&#xff0c;大家好&#xff0c;我是[有勇气的牛排]&…

红外遥控器 数据格式,按下及松开判断

红外遥控是一种无线、非接触控制技术&#xff0c;具有抗干扰能力强&#xff0c;信息传输可靠&#xff0c;功耗低&#xff0c;成本低&#xff0c;易实现等显著优点&#xff0c;被诸多电子设备特别是家用电器广泛采用&#xff0c;并越来越多的应用到计算机系统中。 同类产品的红…

FPGA project :HDMI

实验目标&#xff1a;驱动HdMI显示十色等宽彩条。 本实验的重点是&#xff1a; 1掌握TMDS通信协议。 2rgb565转rgb888。 3编写HDMI驱动程序。 4学会看流程图编写代码。 值得注意的事情 1注意数据与解析数据的信号&#xff08;比如传入的数据中0或者1的个数&#xff09;&…

IoTDB 在国际数据库性能测试排行榜中位居第一?测试环境复现与流程详解第一弹!...

最近我们得知&#xff0c;Apache IoTDB 多项性能表现位居 benchANT 时序数据库排行榜&#xff08;Time Series: DevOps&#xff09;性能排行第一名&#xff01;&#xff08;榜单地址&#xff1a;https://benchANT.com/ranking/database-ranking&#xff09; benchANT 位于德国&…

毛玻璃动画交互效果

效果展示 页面结构组成 从上述的效果展示页面结构来看&#xff0c;页面布局都是比较简单的&#xff0c;只是元素的动画交互比较麻烦。 第一个动画交互是两个圆相互交错来回运动。第二个动画交互是三角绕着圆进行 360 度旋转。 CSS 知识点 animationanimation-delay绝对定位…

Vue之transition组件

Vue提供了transition组件&#xff0c;使用户可以更便捷地添加过渡动画效果。 transition组件 transition组件也是一个抽象组件&#xff0c;并不会渲染出真实dom。Vue会在其第一个真实子元素上添加过渡效果。 props render 这里将render分为两部分&#xff0c;第一部分界定真…

线性表的链式存储结构——链表

一、顺序表优缺点 优点&#xff1a;我们知道顺序表结构简单&#xff0c;便于随机访问表中任一元素&#xff1b; 缺点&#xff1a;顺序存储结构不利于插入和删除&#xff0c;不利于扩充&#xff0c;也容易造成空间浪费。 二、链表的定义 ①&#xff1a;概念&#xff1a; 用一组任…

JavaScript高阶班之ES6 → ES11(八)

JavaScript高阶班之ES6 → ES11 1、ES6新特性1.1、let 关键字1.2、const关键字1.3、变量的解构赋值1.3.1、数组的解构赋值1.3.2、对象的解构赋值 1.4、模板字符串1.5、简化对象写法1.6、箭头函数1.7、函数参数默认值1.8、rest参数1.9、spread扩展运算符1.9.1、数组合并1.9.2、数…

docker-compose 网络配置- IP 主机名 hosts配置

docker-compose 配置IP、hostname、hosts配置 配置IP version: "3" networks:bd-network: # 声明网络external: true services:kafka: # 服务名称networks:bd-network: # 连接的网络名称ipv4_address: 172.2.0.102 # 配置IP配置 主机名 version: "3&quo…

mybatis-spring集成数据库连接池开启注解式开发

目录 1. 引入依赖包 2. 集成配置文件 2.1 开启注解式开发 2.2 spring引入外部配置文件 2.3 数据库连接池 2.4 spring整合mybatis 2.5 自动代理 3. 注解式开发的几个常用注解 4. spring-test 附录一&#xff1a;spring常用注解 1. 引入依赖包 <!--spring整合mybat…

网络基础(一)

通信&#xff0c;在古代是通过书信与他人互通信息的意思。 今天&#xff0c;“通信”这个词的外沿已经得到了极大扩展&#xff0c;它目前的大意是指双方或多方借助某种媒介实现信息互通的行为。 如果按照当代汉语的方式理解“通信”&#xff0c;那么古代的互遣使节、飞鸽传书…