c语言如何答应出数所在数组的下标_零基础学C语言——数组
这是一个C语言系列文章,如果是初学者的话,建议先行阅读之前的文章。笔者也会按照章节顺序发布。
上一篇我们讨论过函数,其中涉及到了一些数组和指针,本篇详细说明数组。
数组定义
数组是一种集合结构,与数学种谈到的集合类似,用来存放同类型数据。在C语言中,数组是定长的,即数组有其最大长度限制,超过限制的访问会导致程序崩溃或异常行为。
定义一个数组的一般形式如下:
数据类型 数组名[数组长度];
其中,数据类型不仅包含了之前文章中介绍的几种基础数据类型,还包含后续文章将会介绍的自定义类型、结构体类型等,数组长度为整数,数组名的命名规则与变量的命名规则一致。
下面看几种数组定义的例子:
int i_array[100]; //定义整型数组,名为i_array,数组长度为100,即可以容纳100个整数char c_array[100]; //定义字符型数组,名为c_array,数组长度为100,即可容纳100个字符
数组声明
数组的声明与函数和变量的声明作用是一样的,是为了告诉编译器,这个数组在本文件或者其他源文件中有定义,避免当前文件编译因找不到定义而报错。
数组声明的一般形式:
数据类型 数组名[数组长度];
看似与数组定义一样,是的,的确可以写成一样的,但数组长度可以省略:
int i_array[100];和int i_array[];
这两个声明是等价的。
这里需要注意,如果省写数组长度,那么在使用sizeof计算i_array长度时编译器会报错。
数组初始化
在定义变量时,我们可以定义并赋初值,数组亦然,但是数组有几种定义并初始化的写法:
1.定义并给出全部初始值
int a[3] = {1, 2, 3};或int a[] = {1, 2, 3};
即初值用{}包裹,且每个元素间用逗号隔开。
对于同时给定初始值的定义,我们是可以省略数组长度的,因为编译器会根据初始值内容判断数组长度。
2.定义并给出部分初始值
int a[3] = {1, 2};
此时数组长度不可省写,否则将被认为数组只有两个元素。数组a的前两个元素分别是1和2,第三个元素数值未知。
3.定义字符数组
字符数组的定义赋初值写法与其他基础类型的定义有所不同
char s[6] = "hello";char s[] = "hello";
上面这两者是等价的,即定义了一个数组长度为6的字符数组。
细心的读者可能会发现,hello只有五个字符,为什么会是6个元素长度呢?
这是因为双引号内的字符串(也是字符数组)都隐含的在最后包含了一个'0'字符来表示字符串结束。因此这类字符串的长度都是双引号内字符个数总和加1。如果使用sizeof运算符计算s的长度,返回的数值就是6。
对于字符型数组(不管是char还是unsigned char)有一种特殊的初始化写法——定义并将数组元素值都清零:
char s[100] = {0};unsigned char us[100] = {0};
此时,数组长度不可省略,且这里不只是初始化数组的第一个元素,而是将数组全部元素值设置成0。
这样的写法仅限于清零,如果换用别的数值,则会变成部分初始化。
数组元素
其实,数组本质上也是一片连续的内存空间,与我们在变量一篇中停车场例子很像。
事实上,数组的每一个元素单元就是一个变量。
我们再次以停车位使用为例来看下数组元素是如何被使用的。这里,我们假设举例镜头最近的停车位位置记为0,并向远处依次加一,且假定这一排有10个停车位。
那么这样一排停车位转换到C语言上,可以如下定义:
int parking_area[10];
之所以定义为整型,是因为每一种车型都可以用一个独特的整数来代替其名字,即车名与整数做了一个映射关系。
此时,一辆宝马驶入第1个车位,我们假定宝马对应整数为1000,那么代码可以写成:
parking_area[0] = 1000; //上面提到过第一个车位的位置为0
这里,我们用到了数组下标运算符。
本篇文章中,数组元素的访问都是通过下标来进行的,关于指针访问元素留待后续指针文章中讨论。
数组的下标个数与数组长度相等,且下标数值从0开始依次加1,即上例中的下标为0~9。
这时又来了一辆奔驰(对应整数记为1001),停入了第二个车位,那么代码如下:
parking_area[1] = 1001;
如果,宝马开走了(假设无车停放记为0),那么代码可以写成:
parking_area[0] = 0;
一个可编译运行的例子
#include int main(void){ char a[10] = {0}; int i; for (i = 0; i < sizeof(a); ++i) { printf("%d", a[i]); } return 0;}
大家可以编译运行一下例子,这里是将定义数组a并将其所有元素全部清0。然后使用数组下标配合循环语句完成数组元素的遍历访问。关于循环的内容,将在后续文章中给出。
多维数组
上面讨论的内容涉及到的例子都是一维数组——即每个数组元素都是一个数值而非数组。
下面,我们就来介绍复杂一些数组形式,我们以二维数组为例进行演示。
int a[2][3];
这里我们就定义了一个二维数组a,它类似一个2行3列的表格或者矩阵。
对于这个二维数组,定义同时初始化可以使用如下方式:
int a[2][3] = {{1, 2, 3}, {4, 5, 6}};或int a[][3] = {{1, 2, 3}, {4, 5, 6}};
可以看到,其最外层数组包含了两个元素,这两个元素又分别是两个相同长度的一维数组。
同时,在定义同时初始化的情况下,第一维的数组长度可以省略,编译器将以初值中的元素个数自动填充。
二维数组的声明形式如下:
int a[2][3];或int a[][3];
即可以省写一维数组长度部分。
对于二维数组的元素访问,可以用如下形式:
a[0][1] = 10; //第1行第2列元素赋值10a[1][2] = 99; //第2行第3列元素赋值99
对于更高维度的数组,在日常生产环境下是不多见的,其一般形式如下:
数据类型 数组名[m][n]...;或数据类型 数组名[m][n]... = {{{...},...},...};
特征就是:
- 是几维数组,数组名后的方括号就有几个
- 是几维数组,初值中就要嵌套几层{}数组
- 是几维数组,访问其元素时数组下标运算符([])就要有几个
- 对于二维及其以上维度的数组,在定义同时初始化时,只有第一维度的数组长度可以省略
- 对于二维及其以上维度的数组,声明时只有第一维度的数组长度可以省略
喜欢的读者可以关注码哥,也可以在下方留言评论,如果有不清楚的地方也可以私信码哥,我会第一时间回复。
感谢阅读!
c语言如何答应出数所在数组的下标_零基础学C语言——数组相关推荐
- python语言学习零基础教学视频_零基础学Python语言CAP全套课程
零基础学Python语言CAP完整版课程目录 ├─{1}–[第1周,第一单元]Python编程之基本方法 │ ├─{1}–1.1课程内容和安排介绍 │ │ ├─(1.1.1)–课程内容和安排介绍-PP ...
- MOOC翁凯_零基础学Java语言
Week 1 计算 1.0 计算机与编程语言 程序的执行:解释和编译(翻译成计算机能懂的机器语言) 1.1 第一个Java程序 JRE:Java运行环境,Oracle网站 Eclipse/IDEA:编 ...
- 详细设计 存储分配_零基础学C语言(7):存储类型
前四节,我们从编写一个计算器的角度,讨论出编程语言需要数据类型.变量和常量,并详细介绍了这三个概念.那么编写一个计算器还需要哪些东西呢? 我们想想看,当我们想设计一个比较复杂的程序,例如开发一款游戏时 ...
- 浙江理工大学c语言作业网站,浙江理工大学 我的编程之路 零基础学C/C++ 200题 标程/题解...
浙江理工大学 我的编程之路 零基础学C/C++ 200题 标程/题解 OJ地址:http://47.96.116.66/index.php 标程/题解GitHub:https://github.com ...
- Java学习记录_1:MOOC《零基础学Java语言》课后习题解
Hey,我是寒水,一名大二学生,电子商务专业在读,正在学习Java中.我试图将在Java学习中遇到的一些困惑和最终的解答发在这个账号上,希望以此来激励我不要放弃学习! 在学习记录这个专题中,我收藏一些 ...
- 零基础学Java语言---编程题
零基础学Java语言-编程题 注意:没有上机实际测过,代码仅供参考 1.温度转换 写一个将华氏温度转换成摄氏温度的程序,转换的公式是: °F = (9/5)*°C + 32 其中C表示摄氏温度,F表示 ...
- 『零基础学Java语言-浙江大学-翁恺』第6周 使用对象
以下为个人学习笔记和习题整理 课程:零基础学Java语言-浙江大学-翁恺 @ 中国大学MOOC https://www.icourse163.org/course/ZJU-1001541001 文章目 ...
- java无线电台RS制信号_中国MOOC_零基础学Java语言_第2周 判断_2信号报告
2 信号报告(5分) 题目内容: 无线电台的RS制信号报告是由三两个部分组成的: R(Readability) 信号可辨度即清晰度. S(Strength) 信号强度即大小. 其中R位于报告第一 ...
- 零基础学c语言 第2版,零基础学C语言(第2版)(1张) 康莉 等 机械工业出版社 9787111372929...
商品描述: 基本信息 书名:零基础学C语言(第2版)(1张) 定价:59.00元 作者:康莉 等 著 出版社:机械工业出版社 出版日期:2012-04-01 ISBN:9787111372929 字数 ...
最新文章
- HTTPD(三)--HTTP2.4.9编译安装
- Dynamic LAN-to-LAN ××× 之 Router-to-Router
- 时序分析:HMM模型(状态空间)
- CAP 2.3版本发布,支持 MongoDB
- api地理编码_通过地理编码API使您的数据更有意义
- 你需要知道的那些 redis 数据结构(前篇)
- Rational AppScan 标准版可扩展性和二次开发能力简介
- 有没有能把excel表弄成线上多人填报的办法?
- 如果一个国家是一种颜色,中国的颜色美哭了!
- Windows和linux(ubuntu)互传文件简便快捷的方法
- java搜索引擎: lucene学习笔记 3
- 如何保持自己 fork 的项目和原始项目同步
- UDP用户态协议栈详细实现
- 基于java的智能化停车系统ER图_智能化的停车场系统设计原则及解决方案
- Java入门第65课——根据周长计算不同形状图形的面积
- 如果能重来,我不会选择北漂——初见北京
- JAVA + 百度地图API 应用
- Java图形界面文字乱码
- 日历控件CalendarView的使用
- 植物大战僵尸数据修改总结
热门文章
- mysql未监控在3306_监控MySQL或Web服务是否正常
- C语言需要什么程序翻译,c语言怎么翻译? 程序怎么运行?
- python南开大学王凯_王凯:长大后我也成了你
- android line分享代码,Android实现Line登录分享
- python cryptography key加密_python3利用cryptography 进行加密和解密
- ajax显示失败信息,javascript
- wpf datagrid 计算两个列的差值_天体到达指定方位角的时间计算
- 胜利大逃亡 三维BFS
- Java实验2 Java语言基础
- vscode-background插件“卸载“以及“禁用“失效