【C语言】如何正确的理解数组 (一维)

18 篇文章 9 订阅
订阅专栏

  

哈喽大家好,我是保护小周ღ,C语言,接下来给大家带来的是数组和指针系列的文章,这篇主要讲的是一维数组的相关知识,是博主的所见所闻,细节上的知识后面会这里面没有提,会放在后期的文章中与指针相结合讲,多多包含。

目录

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

1.1 数组的创建

1.2 数组的初始化

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

2.1 关于数组越界问题

2.2 关于字符数组计算元素个数的问题


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

1.1 数组的创建

我们在程序开发中,常常需要描述一块由多个相同元素的数据项组成的数据,这就是数组。

数组:一组相同类型的元素的集合

数组的定义,举个例子:

int arr[5];

int 是指数组的元素类型,arr 是数组名, [  ] 可以先理解为告诉编译器这是个数组,里面的常量5 代表需要创建多少个 数组元素类型的元素。

这句话怎么站在编程的角度理解呢? 就是在内存的栈区上开辟一块连续的 5个 int 类型的空间(20个字节) ,然后这块空间名字叫 arr。

那我们是不是可以说 arr 的类型为 int [5] , 其实这才是正确的理解。

数组创建,在C99标准之前, [  ] 中 要给一个常量才可以,不能使用变量。在C99标准支持了变长数组的概念,数组的大小可以使用变量指定,但是数组不能初始化。VS 编译器中不支持变长数组,定义的时候只能是给常量。


1.2 数组的初始化

数组在定义创建的时候,我们可以对里面的值进行初始化。

C语言中数组不进行初始化的时候里面都是随机值。我们应该养成好习惯在定义的时候初始化将这些空间值置为0,int arr[5]={0};  也可以根据自己的需要初始化值。

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

 对数组的部分空间初始化:

int arr1[10] = {1,2,3};

那么这一块10 个连续的整型空间前 3块空间的值分别初始化为 1,2,3;后面的7块空间都是随机值。


数组在创建的时候如果想不指定数组的确定的大小就得初始化。

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

这个时候编译器就会 根据初始化的内容来确定数组的元素个数,然后根据元素个数开辟空间。上例,初始化了5个元素,所以编译器会给 arr数组开辟5个 整型空间。


对字符数组的初始化:

首先字符数组也对根据初始的内容(元素个数)开辟相应的空间,只要是数组,在初始化的时候,如果你指定了数组的元素个数,但是你初始化的元素多于指定数组的空间个数,初始化的元素依次赋值给数组空间,多余的部分无效。

C语言里面没有字符串类型!通常用一个字符数组来存放一个字符串。字符数组每一块空间都只占1个字节。而且存储的内容是根据ASCLL码存储。

字符数组初始化的方式有两种:

依次的初始化(也可以指定字符数组的元素个数):

char str1[]={'a','b','c','d','e','f'};

 存储结构如图:

这里给大家介绍一个概念,数组开辟的一块连续的存储空间,数组元素也是一种变量,通常称之为下标变量,我们可以通过数组的下标来表示,数组中的某一个元素。数组的下标规定从 0开始依次往后(详细内容后面讲)。

另外,在初始化的时候 char str1[ ]={  '97' , 97 }; 这两个的含义是不一样的'   ' 引用表示用 ASCLL 码的形式存储,里面的数字会对应 ASCLL 表里字符存储。如果不打引号,这个数字就是单纯的数字,因为一个字节 是八个二进制位,如果是有符号位(signed)char 那么他的取值范围就是 [-128,127] , 无符号位(unsianed)char 取值范围就是 [0~255]  ,ASCLL码 规定由一个字节描述,最高位为 0 ,所以ASCLL 码的取值范围是 [0~127] ,128个字符。 我们所说的 ‘\0’,其实就是 字符 0 ,但是千万不可以理解为 ‘0’,这个是数字0。


 按照“字符串”元素个数开辟空间,和初始化:

char str2[]="abcdef";

这种情况,表面上编译器为 str2 字符数组开辟6 个字节的空间,实际上是7个,因为编译器会把字符串的后一个空间放字符串的结束标志 ‘\0’ 表示字符串已经结束。有了‘\0’标志后,编译器就可依此判断字符串的元素个数,所以使用字符串初始化的时候无须指定数组的长度。在输入,输出的时候还可以一次性处理字符串,可以不使用循环语句逐个输入和输出。(%s)字符串的形式。


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

先来介绍一点知识,数组的使用,数组的 [ ] 是操作符,下标引用操作符,作用是就是可以访问数组元素, 数组名 [下标值] 即可访问对应下标的元素。

通过以上代码我们得出几点知识:

1. arr 就是数组名,数组名代表就是 数组首元素(下标为0 的元素)的地址,但是有两个例外

  • sizeof(数组名);计算的是整个数组的地址。
  • &数组名,数组名是表示整个数组,是取整个数组的地址。

sizeof 这个标识符的作用就是计算 它包含的在内存中所占的字节数。

所以我们计算一个整型数组的元素个数,可以用:sizeof (数组名) / sizeof(数组的任意一个元素);我们一般是 / 首元素。

2.  栈区内存的使用习惯:先使用高地址处的空间,再使用低地址处的空间。

3. 假设 arr 数组在内存的栈区上开辟了一块连续的存储空间(40个字节),数组每个元素的地址根据数组的下标的增长,由低地址向高地址变化。

 4. 数组在内存中是连续存放的

 5.  如果我们对定义的数组造成越界访问( 越界就是通过操作符等手段访问了不属于数组的空间),这种是很容易造成的错误,一定要注意,数组下标从 0  开始。没有初始化的空间往往就是随机值,也有可能是“烫烫烫”。


2.1 关于数组越界问题

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

咱们写代码时,最好自己做越界的检查,一定要注意, 越界访问有可能就造成了对别的空间的非法使用,如果那块空间给到了某个变量维护,这就是很严重的错误。


2.2 关于字符数组计算元素个数的问题

上文说到字符数组的初始化有两种方式:

char  str1[ ]={ 'a','b','c','d','e','f' };

char  str2[ ]="abcdef";

我们先用sizeof 标识符来试试计算长度:

#include<stdio.h>
int main()
{
	char str1[] = {'a','b','c','d','e','f'};

	char str2[] = "abcdef";

	int len1 = sizeof(str1) / sizeof(str1[0]);
	int len2 = sizeof(str2) / sizeof(str2[0]);

	printf("str1数组的元素个数为:%d\n", len1);
	printf("str2数组的元素个数为:%d\n", len2);
	
	return 0;
}

这也证明了我们上文说的 如果直接初始化一个字符串,那么在字符串的最后还会使用一个空间存字符串的结束标志 '\0' ,在C语言当中 '\0'可是字符串里很重要的一点。我们在使用%s 以字符串的形式输入,其实最后编译器会默认在最后添加一个 '\0'; 使用 %s 以字符串的形式输出的时候,会根据 '\0' 来打印,'\0'之后的字符不会被打印。

举个例子:

scanf() 输入字符串:

我们可以看到我给 字符数组指定了10个字节的存储空间,理论上我们可以存10个字符,没有问题,但是我们是以字符串的形式输入,自己我输入了 10 个字符a 也打印出来了10个a  但是编译器报了个错,这是为什么呢?因为以字符串的形式存储,需要留一个空间存储 ‘\0’  所以造成了越界使用空间,使用了 11个字节的空间,这样是不行的,所以我们给字符数组指定了空间大小(定义的时候),我们一定记得预留一个空间存储 ‘\0’ 。

错误得示范,越界访问时绝对不可以的, 越界使用更是大大得错误,一定要注意!

字符数组才可以整体得输入输出,整型数组,或者是浮点型数组,都得老老实实的循环输入输出!


 我们使用 strlen ( ) 库函数来试试计算字符数组长度:

这里我们就很奇怪,str2 这个数组里,确实是 6个有效字符,没有问题,那么 str1 数组明明是只输入了 6个字符,为什么会有这个结果 19呢,好奇怪啊,接下来博主来给你们解答疑惑。

strlen( ) 这个库函数 专门计算字符数组的元素个数,那么他是根据 '\0'(字符串结束标志)来计算,遍历字符串,直到在内存中找到 '\0' 为止。返回类型是 无符号整型。

str1 字符数组,我们没有存放 '\0' 结束标志,所以在使用 strlen() 函数的时候就会越界访问,直到找到'\0' 。

不断地进行,越界访问,直到在内存中找到了 '\0' ,然后统计了 '\0' 之前的个数,这就是 strlen(str1)打印 19 原因,所以结束标志很关键得嘞。

当然解决方案就是:

char str[]={'a','b','c','d','e','f','\0'};

 主动添加字符串结束标志,这就是争对循环输入字符的方式,手动末尾添加。


 printf() 打印字符串

你们看咱们初始化的时候将 '\0' 其实就是字符0,放入str [ ]数组,没有问题,但是在打印的时候却忽略了  '\0' 后的字符 efg ,所以打印也是根据 '\0' 来决定打印的字符。


至此C语言一维数组博主已经分享完了,相信大家对一维数组有了不同的理解,尽请期待数组 &&指针。

本期收录于博主的专栏——C语言,适用于编程初学者,感兴趣的朋友们可以订阅,查看其它“C语言基础知识”。 C语言_保护小周ღ的博客-CSDN博客

感谢每一个观看本篇文章的朋友,更多精彩敬请期待:保护小周ღ  *★,°*:.☆( ̄▽ ̄)/$:*.°★*  

文章多处存在借鉴,如有侵权请联系修改删除!

C语言之三维数组
十三阿哥的博客
07-20 4万+
前言: 之前学习C语言的时候仅仅是掌握了二维数组,但是并没有对三维数组进行研究,今天的代码提前搞完了,摸摸鱼,对去年研究的三维数组的相关知识发布一下,期待能够帮助到有缘人!实际上,当你阅读此篇文章时,我假设你已经对C语言的二维数组非常熟悉了,并且非常熟悉数组与指针之间的关系,如果没有达到此要求,那直接翻篇,不要看,等待基础掌握扎实后再来学习此篇文章! 一,看图说话,一眼看三维数组 二,首先看下三维数组的遍历 #include "stdio.h" void main(){ //三维数组 .
c语言一维数组和二维数组实验报告,二维数组的实验报告.doc
weixin_30423205的博客
05-22 2017
二维数组的实验报告高级语言程序设计实验报告班级: 0900 姓名: 学号: 09006课程名称高级语言程序设计实验项目一级指针与一维数组变成及函数编程练习实验项目类型验证演示综合设计指导教师李养群成 绩一、实验目的(1) 掌握一级指针的定义与使用。(2)掌握一维数组的定义与使用,理解数组的长度与下标的范围。(3)正确使用流程控制语句,掌握指...
黑马编程员 -- 一维数组总结
qq_28819841的博客
06-10 735
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------                                                                                                   一维数组总结 一维数组的定义方式 在C语言中使用数组必须先进行定义。一维数组的定义
C语言 一维数组详解
流楚丶格念的博客
10-24 6347
文章目录一维数组多角度看一维数组一维数组声明问题1:那么b的类型是什么呢?它所表示的又是什么?问题2:指针和数组是等价的吗?问题3:那么数组在什么情况下不能作为指针常量呢?下标引用问题1:`*(arr + 3) `,这个表达式是什么意思呢?问题2:数组下标可否为负值?问题2:请阅读如下代码,说出结果:问题3: `a[i]==i[a]==*(i+a)==*(a+i)?` 一维数组 在程序中可以使用下标变量,即说明这些变量的整体为数组数组中的每个变量的数据类型是相同的。 当数组中每个元素都只带有一个下标时,称
数组—— 一维数组
最新发布
2302_80618805的博客
07-27 1273
数组就是相同类型的元素集合• 数组中存放的是1个或者多个数据,但是数组元素个数不能为0。• 数组中存放的多个数据,类型是相同的。数组分为⼀维数组和多维数组,多维数组⼀般⽐较多⻅的是⼆维数组
C 语言之一维数组(详细版)
weixin_45332776的博客
05-10 6318
目录 1.一维数组的定义和初始化 2.一维数组在内存中的存储 3.一维数组的使用 4.一维数组的应用实例 1. 一维数组的定义和初始化
C语言基础】数组~一维数组
tqy_879的博客
07-06 707
形式:数据类型 数组名[常量表达式];例如: int a[10];上面定义了一个含有10个整型元素的一维数组数组名为a。说明:(1)数据类型是数组中每个元素的数据类型;(2)数组名的命名规则与变量的命名规则相同;(3)常量表达式的值一般是一个整型数据,它表示数组的长度;(4)C语言规定数组元素的下标是从0开始引用的,如上面的数组a的10个元素分别为a[0],a[1],a[2]...a[9]。
C语言一维数组概述
BEYONDmonster的博客
03-08 562
数组的定义: 在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可以分为数值数组、字符数组、指针数组、结构数组等各种类别。 注意:数组元素有序不是指元素大小顺序。 一维数组的定义: 在C语言中...
举例理解C语言二维数组的指针指向问题
09-03
这也就是说,二维数组可以看作是由多个一维数组组成的。例如,在给定的例子中,`int iArray[2][3]` 是一个包含2个长度为3的整数数组数组。每个子数组都由三个整数组成,我们可以分别通过 `iArray[0]` 和 `iArray[1...
理解C语言一维数组的传参
xxhhw的博客
10-16 791
数据数组与指针数组的传参方式
C语言循环、数组、函数及指针练习题精选及答案
03-28
- 一维数组是最基础的,还有二维数组(矩阵)和多维数组。 - 数组的声明、初始化和动态分配内存都是C语言中重要的知识点。 - 数组名代表数组首元素的地址,因此可以传递数组的引用到函数中。 3. **函数**: - ...
C语言一维数组详解
m0_57864978的博客
04-06 756
C语言中的一维数组是一种能够容纳固定数量相同类型数据的数据结构。数组中的每个元素都可以通过下标来访问,下标从0开始,最大值为数组长度减一。以下是一维数组的详细解释和示例代码。
C语言数组详解(一维数组、二维数组
ks_wyf的博客
03-06 1723
C语言 [数组详解]
Java学习记录: 数组作业
NXY78787的博客
12-15 413
数组:存储一组相同数据类型的有序集合。 特点: 1、数组中的元素必须是同一种数据类型,可以是基本数据类型,也可以是引用数据类型 2、获取数组元素需要使用下标来获取,下标范围[0,length-1] 3、数组在定义的时候必须指定大小,并且一旦指定大小之后是不能修改的 4、数组中的元素是有序集合,这个有序指的不是大小排序,指的按照插入的先后顺序 使用...
一维数组
初学java
12-07 155
一维数组的声明方式: 格式: type var []; 例如: int a1[]; double b[]; String [] p1; 注: java语言中声明数组时不能指定其长度(数组中元素的个数),例如: 非法声明:int a[5]; 数组对象的创建: 1:java中使用关键字new创建数组对象。 2:基本数据类型的数组的元素java系统会自动初始化。而引用数据类型的数组中的每一个元素都...
写文章

热门文章

  • C语言标准库函数qsort( )——数据排序 13106
  • 程序猿眼中的协议:TCP / IP 五层网络模型 8548
  • 【HTTP 协议】掌握 Web 的核心技术 7201
  • 每日一题——输入一个日期,输出它是该年的第几天 7076
  • 【Spring】核心与设计思想 6431

分类专栏

  • 软件测试 3篇
  • JavaEE 18篇
  • Linux 2篇
  • MySQL 6篇
  • C语言 18篇
  • 网络编程 8篇
  • Java数据结构 2篇
  • JavaSE 4篇
  • 排序算法 7篇
  • 每日一题 8篇
  • 我的生活 1篇
  • 小程序 1篇

最新评论

  • 软件测试认知篇

    程序猿教你打篮球: 感谢老哥的支持

大家在看

  • SQL查询中字段选择的两种写法:select * VS select 字段名
  • 【数据结构】图的遍历
  • OpenCV学习笔记(完) 516
  • 用Springboot+Vue实现文件上传和下载
  • 【网络原理】TCP核心机制:连接管理,滑动窗口 417

最新文章

  • 【软件测试】Bug 篇
  • 【软件测试】常用的开发、测试模型
  • 软件测试认知篇
2024年3篇
2023年36篇
2022年32篇

目录

目录

评论 95
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

保护小周ღ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

天下网标王优化线路访问网站速度好的珠宝行业网站优化电话多少便宜的优化网站网址推广优化网站专业网站优化价格湖北网站优化软件临海畅销百度网站优化优化建站益阳网站搜索优化怎么做汉川优化网站排名苏州网站优化费用明光网站搜索排名优化外包网站优化多少钱孝感专业网站优化韶关网站优化公司有哪些特点刻意优化对网站的影响金华优化网站关键词费用锦江区网站排名优化网站优化友情链接怎么换南昌网站排名优化公司网站优化搜索引擎优化株洲网站建设优化公司哪家好网站优化当中怎么加入h标签安庆企业网站优化服务公司濮阳网站怎么优化玉田网站优化百度关键词怎么优化网站南昌网站的优化兰州网站排名优化网站按天计费优化推广个人网站怎么优化香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

天下网标王 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化