8.1.2. 数组的使用

1.定义数组

  • <类型> 变量名称[元素数量];如int grade[10];确切的说,这个类型不是数组的类型,而是数组中每一个单元的类型.每一个数组都是一个包含多个值的变量,所以我们需要给它一个名字.而后面的数字则是这个数组包含的单元的数量.
  • 元素数量必须是整数.如果带着小数点是没有意义的.
  • 另外在c99以前,数组的元素数量必须是编译时确定的字面量,不能是变量.但c99之后,我们已经可以用变量定义数组的大小了.

 数组是一种容器(放东西的东西),容器是现代编程语言设计中非常重要的一个概念,或者说现代的编程语言都应该提供某种形式的容器,它是一门编程语言能力大小的重要评判标准之一.数组的特点是:

  • 其中所有的元素都具有相同的数据类型.
  • 一旦创建,不能改变其大小.
  • 数组中的元素在内存中是依次排列的.

如:

(在赋值号左边的时候我们是在往它里面写东西,即给数组中的元素赋值,在赋值号右边的时候即在读取数组元素的值.)

2.数组的单元

  • 数组的每个单元就是数组类型的一个变量.
  • 使用数组时放在[]中的数字叫做下标或者索引,下标从0开始计数,其范围应该是0~n-1(n为定义数组时的元素数量).其实历史上在Fortran语言时期就已经有数组了,但从0开始编号是c语言开始的,这样子编译器可以简化很多事情.

3.有效的下标范围

  • 编译器和运行环境都不会检查数字的下标是否越界,无论是对数组单元做读或者写的操作.
  • 一旦程序运行,过界的数组访问可能造成问题,会导致程序崩溃.

如果我们看到程序运行出来出现segmentation fault,有可能就是因为数组下标越界了.不过也有可能运气好,不会造成严重的后果.所以这就是为什么有时候这次运行是好的,而下一次运行就不行.  或者在我的电脑上可以运行,但是到了你的电脑又不行了.问题一般是数组越界了或者指针出错了.所以这是程序员的责任来保证程序使用的数组的下标在[0,数组的大小-1]这个范围.现在我们来试一下数组下标越界这件事情:

如果我们在Windows用llvm去编译,会发现它给了我们一个segmentation fault,但是它只会给你一个warning而不是error,因为它不知道你是不是故意这样做的,而其他很多编译器甚至不会给warning.我们发现,程序最后也没给我们打印here.这是因为这个程序把0写到了一个不该写的地方,然后调用了f,然后根本没回到主函数我们的程序就崩溃了.(而令人惊奇的是,dev c++不但能正确打印越界数组的值,并且还打印了here,同时没有任何编译warning或者error)

再如,我们之前写过一个程序:

这个数组是危险的,因为输入的数据可能超过100个.我们有两种解决方案,一种是设置一个计数器count,每次循环的时候让count++,用if判断count是否大于数组下标的最大值(数组个数-1).如果大于的话就不会再继续读入数字了.第二个方案,我们可以利用c99的特性,即定义数组时大小可以是动态的,那么我们可以让用户先定义一个变量,再根据需要数的个数去输入这个变量的值, 然后我就可以用这个数去创建一个数组了.

ps:长度为0的数组是存在的,如int a[0]; 但是没有任何意义.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值