C语言学习 五、一维数组与字符数组

news2024/9/23 19:17:06

5.1一维数组

5.1.1数组的定义

数组特点:

  1. 具有相同的数据类型
  2. 使用过程中需要保存原始数据

C语言为了方便操作这些数据,提供了一种构造数据类型——数组,数组是指一组具有相同数据类型的数据的有序集合。

一维数组的定义格式为

数据类型 数组名[常量表达式];

例如:

int a[10]; //定义一个整型数组,数组名为a,长度为10个元素

声明数组时要遵循以下规则:

  1. 数组名的命名规则和变量名的规则相同,即遵循标识符命名规则。
  2. 在定义数组时,需要指定数组中元素的个数,方括号[ ]中的常量表达式用来表示元素的个数,即数组长度。
  3. 常量表达式中可以包含常量和符号常量,但不能包含变量,也就是说,C语言不允许对数组的大小做动态定义,即数组的大小不依赖于程序运行过程中变量的值。

以下是错误的声明示例(最新的C标准支持,但最好不要这么写):

int n;

scanf("%d",&n); //在程序中临时输入数组的大小

int a[n];

数组声明的其他常见错误如下:

float a[0];  //数组大小为0没有意义

int b(2)(3); //不能使用圆括号

int k = 3,a[k]; //不能用变量说明数组大小

5.2一维数组在内存中的存储

一维数组初始化方法:

(1)在定义数组时对数组元素赋初值,例如:

int a =[10] = {0,1,2,3,4,5,6,7,8,9};

不能写成

int a[10];

a[10] = {0,1,2,3,4,5,6,7,8,9};

(2)可以只给一部分元素赋值,例如:只给前5个元素赋初值,后5个元素值为0

int a =[10] = {0,1,2,3,4};

(3)如果要使一个数组中全部元素的值为0,可以写成:

int a =[10] = {0,0,0,0,0,0,0,0,0,0};

int a[10] = {0}; //更推荐这种写法

(4)在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组的长度(编译器具有自动计算有几个元素的功能)。(考研初试不建议使用,因为改卷老师需要手动数有几个数)

int a[]={1,2,3,4,5};

 5.3数组的访问越界

5.3.1访问越界例子

【访问越界演示】

#include <stdio.h>

int main() {
    int arr[5] = {1, 2, 3, 4, 5}; //定义数组
    int j = 20;
    int i = 10;
    arr[5] = 6; //访问越界
    arr[6] = 7;
    printf("i=%d\n", i); //i=7 i并没有赋值,但是值却变化了
    return 0;
}

【运行结果】

 5.3.2查看内存视图

在内存视图依次输入&arr,&j,&i 来查看整型数组arr,整型变量j,整型变量i的地址。

 

 

 5.3.3总结
  • 访问越界是很危险的,C语言并没有对访问越界进行检查
  • CLion当中的地址都是8字节64位的,考研当中给的大多数为4个字节,即Windows32位控制台应用程序为0x00 00 00 00 到 0xFF FF FF FF,总计为2的32次方,大小为4G。
  • 数组注意点:编译器并不检查程序对数组下标的引用是否在数组的合法范围内:

好处:不用浪费时间对有些已知正确的数组下标进行检查

坏处:无法检测出无效的下标引用

一个良好的经验法则:

  • 如果下标值是通过那些已知正确的值计算得来则无需检查
  • 如果下标值是由用户输入产生,那么使用它们之前必须进行检查,以确保在有效范围内

5.4数组的传递

【数组传递反例】

#include <stdio.h>

//一维数组传递
//子函数是把一个常用的功能封装起来
//数组名传递到子函数后弱化成指针(8字节),子函数的形参接收到的是数组的起始地址,因此不能把数组的长度传递给子函数
void print(int a[]) {
    //数组传递不需要写数字,因为数组长度传递不过来
    int i;
    for (int i = 0; i < sizeof(a) / sizeof(int); i++) {
        //sizeof(a)/sizeof(int)
        //数组整个的长度/int的长度 即20个字节/int 4个字节 = 5
        printf("%d\n", a[i]);
    }
}

//main函数就是主函数
int main() {
    int a[5] = {1, 2, 3, 4, 5};
    print(a); //调用子函数
    return 0;
}

【运行效果】

 【单步调试】

【正确的数组传递例子】

#include <stdio.h>

//一维数组传递
//子函数是把一个常用的功能封装起来
//数组名传递到子函数后弱化成指针(8字节),子函数的形参接收到的是数组的起始地址,因此不能把数组的长度传递给子函数
void print(int b[], int length) { //多定义一个变量length作为数组的长度
    //数组传递不需要写数字,因为数组长度传递不过来
    int i;
    for (int i = 0; i < length; i++) {
        printf("%3d", b[i]);
    }
    printf("\n");//换行
    b[4] = 10;
}

//main函数就是主函数
int main() {
    int a[5] = {1, 2, 3, 4, 5};
    print(a, 5); //调用子函数 
    printf("b[4]=%d\n",a[4]); //发现b[4]值发生改变
    return 0;
}

【运行效果】

总结:

  • 在调用函数时,一维数组的长度传递不过去,所以通过length来传递数组中的元素个数。
  • 实际数组名中存储的数组的首地址,在调用函数传递时,是将数组的首地址赋给了变量b。
  • 在b[ ]的方括号中填写任何数字是没有意义的,因为不能将数组长度传递给子函数。
  • 此时在print函数内修改元素b[4]=10可以看到数组b的起始地址和main函数中数组a的起始地址相同,即二者在内存中位于同一位置,当函数执行结束时数组a中元素a[4]就得到了修改。

 

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

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

相关文章

删除数组中的指定元素(了解如何删除数组中的指定元素,并返回一个新的数组,看这一篇就足够了!)

前言&#xff1a;有时候我们会遇到要在数组中删除指定元素&#xff0c;但是不能创建新的数组&#xff0c;那么这个时候应该如何操作呢&#xff1f; ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 废话不多讲&#xff0c;让我们…

阿里 Modelscope 创空间部署在本地环境操作文档

创建创空间的步骤直接跳过。 备注:我的电脑是Windows 第一步&#xff1a;获取创空间代码&#xff0c;直接下载代码太慢了&#xff0c;建议通过git获取代码 第二步:复制链接,打开cmd 直接粘贴回车下载。下载完之后的到了我的Service-Assistant文件夹。再git clone https://gith…

幻尔机械臂FPV安装darknet_ros(YOLO V3)

mkdir -p catkin_workspace/src cd catkin_workspace/src git clone --recursive gitgithub.com:leggedrobotics/darknet_ros.git cd ../ 在ROS工作空间目录下&#xff0c;执行命令&#xff1a; catkin_make -DCMAKE_BUILD_TYPERelease 发布摄像头图像话题&#xff1a; …

电商API数据采集接口——电商大数据构建及智能应用

现在越来越多的电商企业和运营都开始关注数据的应用&#xff0c;在13年淘宝运营技巧的爆发&#xff0c;这其实就是数据带来的红利。在数据大爆炸的时代&#xff0c;数据分析已经成为了企业制定策略、发现问题的重要方法&#xff0c;所以&#xff0c;数据分析绝对是企业管理的贤…

利用云手机高效运营多个海外社媒账户

随着全球化进程的不断推进&#xff0c;中国出海企业和B2B外贸企业日益重视海外社媒营销&#xff0c;将其视为抢占市场份额的关键策略。在海外社媒营销中&#xff0c;企业通常会在多个平台上批量开通账户&#xff0c;搭建自己的社媒内容矩阵。本文将会介绍如何用云手机高效运营多…

【HarmonyOS】ArkUI - 页面路由

一、概念 页面路由是指在应用程序中实现不同页面之间的跳转和数据传递。 案例&#xff1a;第一次使用某个购物应用&#xff0c;打开时肯定会是一个登录页&#xff0c;在登录成功以后&#xff0c;会跳转到首页&#xff0c;然后可能会去搜索&#xff0c;就会进入到搜索列表页&am…

NFTScan | 03.18~03.24 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期&#xff1a;2024.03.18~ 2024.03.24 NFT Hot News 01/ NFT 系列 NodeMonkes 地板价已超越 BAYC 3 月 18 日&#xff0c;据数据显示&#xff0c;NFT 系列 NodeMonkes 地板价已超越 Bored Ape Yacht …

C#宿舍信息管理系统

简介 功能 1.发布公告 2.地理信息与天气信息的弹窗 3.学生信息的增删改查 4.宿舍信息的增删改查 5.管理员信息的增删改查 6.学生对宿舍物品的报修与核实 7.学生提交请假与销假 8.管理员对保修的审批 9.管理员对请假的审批 技术 1.采用C#\Winform开发的C\S系统 2.采用MD5对数据…

python每日分析练习:电商平台用户行为数据洞察

模拟电商平台进行数据分析。数据分析最重要的是分析思路&#xff0c;工具是辅助&#xff0c;企业案例都是基于实际案例简单模拟后给出&#xff0c;只有通过实际的练习才能提高我们对数据的敏感度和分析能力&#xff0c;每天一个分析练习场景&#xff0c;一起打怪升级 场景与分…

(bug2总结)-mysql 字段为varchar,用int去查的时候可能会多返回数据

场景&#xff1a;表结构和数据如下图 查询语句如下 总结&#xff1a; mysql 字段为varchar,用int去查的时候可能会多返回数据。mysql版本为5.7.4

R语言迅速计算多基因评分(PRS)

Polygenic Risk Scores in R 最朴素的理解PRS&#xff1a; GWAS分析结果中&#xff0c;有每个SNP的beta值、se值、P值&#xff0c;因为GWAS分析中将SNP变为0-1-2编码&#xff0c;所以这些显著的SNP的beta值&#xff0c;就可以用于预测。 比如&#xff1a;GWAS分析中&#xf…

疲劳检测YOLOV8

疲劳检测YOLOV8&#xff0c;只需要OPENCV&#xff0c;采用YOLOV8训练得到PT模型&#xff0c;然后转换成ONNX&#xff0c;OPENCV调用&#xff0c;支持C/PYTHON/ANDROID开发疲劳检测YOLOV8

加速新能源汽车产品迭代:融合前沿科技的重要性

新能源汽车新质生产力提升咨询方案 一、新能源汽车企业行业目前发展现状及特点&#xff1a; 1、快速增长 2、技术迭代快 3、竞争加剧 二、新能源汽车企业发展新质生产力面临的痛点&#xff1a; 1、技术创新压力巨大 2、市场竞争激烈 3、供应链稳定性欠缺 4、成本控制压…

【等保测评机构】天津等保测评机构公司名单看这里!

天津等保测评机构公司名单看这里&#xff01; 1、天津市兴先道科技有限公司 2、恒利德&#xff08;天津&#xff09;科技有限公司 3、中国民航大学&#xff08;信息安全测评中心&#xff09; 4、天津恒御科技有限公司 5、天津联信达软件技术有限公司 6、佰运俐&#xff0…

Java Day16 Servlet(二)

Servlet 1、继承结构2、ServletConfig对象3 、ServletContext3.1 获得路径3.2 域对象相关API 4、HttpServletRequest4.1 获得请求行和请求头相关api4.2 请求中键值对相关api 1、继承结构 顶级Servlet接口 //初始化void init(ServletConfig var1) throws ServletException; //…

【Redis】数据类型、事务执行、内存淘汰策略

目录 数据类型 Redis事务执行步骤 步骤&#xff1a; redis内存淘汰策略 设置内存淘汰策略 1.设置配置文件 2.通过命令设置 数据类型 官网解释 Understand Redis data types | Redis 首先&#xff0c;Redis 的所有键都是字符串,常用的数据类型有 5 种&#xff1a;Strin…

ArkTS编写的HarmonyOS原生聊天UI框架

简介 ChatUI&#xff0c;是一个ArkTS编写的HarmonyOS原生聊天UI框架&#xff0c;提供了开箱即用的聊天对话组件。 下载安装 ohpm install changwei/chatuiOpenHarmony ohpm 环境配置等更多内容&#xff0c;请参考如何安装 OpenHarmony ohpm 包 接口和属性列表 接口列表 接…

算法系列--动态规划--子序列(1)

&#x1f495;"深思熟虑的结果往往就是说不清楚。"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;算法系列–动态规划–子序列(2) 今天带来的是算法系列--动态规划--子序列(1),是子序列问题的开篇!带大家初识子序列问题 一.什么是子序列问题 我们…

【Burpsuite抓取APP、小程序数据包教程】

文章目录 一、抓取APP数据包1、burpsuite设置2、逍遥模拟器设置3、抓包即可 二、抓取小程序数据包1.bp设置代理端口2.利用火狐插件foxyproxy设置代理3.访问连接http://burp下载证书4.浏览器导入证书5.设置Proxifier6.配置代理规则7.进入小程序抓包 总结 一、抓取APP数据包 1、…

openGauss学习笔记-250 openGauss性能调优-使用Plan Hint进行调优-Join方式的Hint

文章目录 openGauss学习笔记-250 openGauss性能调优-使用Plan Hint进行调优-Join方式的Hint250.1 功能描述250.2 语法格式250.3 参数说明250.4 示例 openGauss学习笔记-250 openGauss性能调优-使用Plan Hint进行调优-Join方式的Hint 250.1 功能描述 指明Join使用的方法&#…