博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++ fill 二维数组初始化_C的探查之路06-数组
阅读量:30595 次
发布时间:2020-01-05

本文共 2168 字,大约阅读时间需要 7 分钟。

一维数组

数组是含多个数据值的数据结构,并且每个数据值具有相同的数据类型,这些值称为元素,可以根据元素的位置把它们一个个选出来。

数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 numbers[0]、numbers[1]、...、numbers[99] 来代表一个个单独的变量。数组中的特定元素可以通过索引访问。

所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。

e04a570f20420263353aa5ac536bd0a1.png

在 C 中要声明一个数组,需要指定元素的类型和元素的数量,如下所示:

type arrayName [ arraySize ];

这叫做一维数组。arraySize必须是一个大于零的整数常量,type可以是任意有效的 C 数据类型。例如,要声明一个类型为 double 的包含 10 个元素的数组balance,声明语句如下:

double balance[10];

现在 balance 是一个可用的数组,可以容纳 10 个类型为 double 的数字。

初始化数组:

double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};

大括号 { } 之间的值的数目不能大于我们在数组声明时在方括号 [ ] 中指定的元素数目。

balance[4] = 50.0;

上述的语句把数组中第五个元素的值赋为 50.0。所有的数组都是以 0 作为它们第一个元素的索引,也被称为基索引,数组的最后一个索引是数组的总大小减去 1。这就是数组下标

e31504e71ee1e638adb95d68fdf5c95f.png

当你想访问数组元素时可以通过数组名称加索引进行访问。元素的索引是放在方括号内,跟在数组名称的后边。比如:

double salary = balance[9];

如果对数组使用sizeof运算符,则可以确定数组的大小,如果数组a有10个整数,那么sizeof(a)通常为40。假设整数占4个字节。

当然还可以通过sizeof来计算数组元素的大小。用数组的大小除以数组元素的大小可以得到数组的长度:

sizeof(a) / sizeof(a[0])

多维数组

C 语言支持多维数组。多维数组声明的一般形式如下:

type name[size1][size2]...[sizeN];

例如,下面的声明创建了一个三维 5 . 10 . 4 整型数组:

int threedim[5][10][4];

二维数组

多维数组最简单的形式是二维数组。一个二维数组,在本质上,是一个一维数组的列表。声明一个 x 行 y 列的二维整型数组,形式如下:

type arrayName [ x ][ y ];

其中,type可以是任意有效的 C 数据类型,arrayName是一个有效的 C 标识符。一个二维数组可以被认为是一个带有 x 行和 y 列的表格。下面是一个二维数组,包含 3 行和 4 列:

int x[3][4];

d5d67e357391e527a80860a362a26e65.png

因此,数组中的每个元素是使用形式为 a[ i , j ] 的元素名称来标识的,其中 a 是数组名称,i 和 j 是唯一标识 a 中每个元素的下标。

初始化二维数组

多维数组可以通过在括号内为每行指定值来进行初始化。下面是一个带有 3 行 4 列的数组。

int a[3][4] = {   {0, 1, 2, 3} ,   /*  初始化索引号为 0 的行 */ {4, 5, 6, 7} ,   /*  初始化索引号为 1 的行 */ {8, 9, 10, 11}   /*  初始化索引号为 2 的行 */};

访问二维数组元素

二维数组中的元素是通过使用下标(即数组的行索引和列索引)来访问的。例如:

int val = a[2][3];假设以上面的数组为例输出结果是 11

数组越界及其避免方法

所谓的数组越界,简单地讲就是指数组下标变量的取值超过了初始定义时的大小,导致对数组元素的访问出现在数组的范围之外,这类错误也是 C 语言程序中最常见的错误之一。

C 语言中数组的大小必须在程序运行前就确定下来。但是它并不检验数组边界,数组的两端都有可能越界,从而使其他变量的数据甚至程序代码被破坏

数组下标取值越界

数组下标取值越界主要是指访问数组的时候,下标的取值不在已定义好的数组的取值范围内,而访问的是无法获取的内存地址。例如,对于数组 int a[3],它的下标取值范围是 [0,2](即 a[0]、a[1] 与 a[2])。如果我们的取值不在这个范围内(如 a[3]),就会发生越界错误。示例代码如下所示:

6727a5c3b3ffc2ed331e2260ceac4a25.png

ffed5324023ef9ad72aee97f67107fd9.png

访问 a[3] 是非法的,将会发生越界错误。

代码示例:

8ac6d7e644fbb4c92e08b6b20a180ca3.png

一开始定义N为5个元素的数组,通过for循环去打印n[i],你会发现从下标5开始后面5个元素全部都是随机值。

因为C不报错,会继续打印后边的内存地址,如果后边的区域是不能访问的地方,就会被操作系统提示segment fault然后干掉程序,而越界的就是接下来内存里四个字节的内容。如果你通过数组名称,格式化输出选%p,打印数组开头的地址,一个int四个字节

1ec3ac4b41d9b1d04dc02d8a4a382d28.png

这就是后面从下标5开始到下标9的内存地址。

所以数组下标的取值范围只能预先推断一个值来确定数组的维数。

转载地址:http://dmzsdu.baihongyu.com/

你可能感兴趣的文章
详解Java业务领域分层模型中的vo/po/dto/pojo/bo
查看>>
Java持久层框架MyBatis全注解详解
查看>>
Java线程组ThreadGroup
查看>>
Java同步器之AbstractOwnableSynchronizer详解
查看>>
为什么需要学习并发编程?
查看>>
Java计算机IT编程文档常见单词翻译
查看>>
Java协作中断机制
查看>>
MySQL8.0数据库基础教程(二)-理解"关系"
查看>>
2020年最新阿里Java面试题,看看你都会了吗?
查看>>
大厂业务开发面试必问的UML你都会了吗?
查看>>
MySQL8.0关系数据库基础教程(三)-select语句详解
查看>>
Incorrect string value: '...' for column 'course' at row 1MySQL插入中文错误:
查看>>
JVM参数调优基础-参数的类型详解
查看>>
大厂都这么使用MySQL8进行条件查询
查看>>
SpringCloud微服务实战(十一)-微服务网关及其实现原理(Zuul为例讲解)
查看>>
Java程序员求职热点问题总结(持续更新)
查看>>
数据结构与算法(一): 动态数组
查看>>
MAT启动报错
查看>>
Jprofile解析dump文件使用详解
查看>>
浅谈代码覆盖率
查看>>