C语言数组

数组

数组的定义

为了存放鞋子,假设你把衣柜最下面的一层分成了 10 个连续的格子。此时,让他人帮你拿鞋子就会很方便,例如你可直接告诉他拿衣柜最下面一层第三个格子中的鞋子。同样假设现在我们有 10 个整数存储在内存中,为方便存取,我们可以借助 C 语言提供的数组,通过一个符号来访问多个元素。
某班学生的学习成绩、一行文字、一个矩阵等数据的特点如下:
(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]; /* 不能用变量说明数组大小*/

一维数组在内存中的存储

语句 int mark[100];定义的一维数组 mark 在内存中的存放情况如下图所示,每个元素都是
整型元素,占用 4 字节,数组元素的引用方式是“数组名[下标]”,所以访问数组mark 中的元素的方式是 mark[0],mark[1],…,mark[99]。注意,没有元素 mark[100],因为数组元素是从0开始编号的。
在这里插入图片描述

数组的访问越界

在第 10 行左键打上断点,然后单击“小虫子”按钮,在内存视图依次输入&j、&a、&i 来查看整型变量 j、整型数组 a、整型变量i 的地址,即可看到三个变量的地址,这里就像我们给衣柜的每个格子的编号,第一格、第二格……一直到柜子的最后一格。操作系统对内存中的每个位置也给予一个编号,对于 Windows 32 位控制台应用程序来说,这个编号的范围是从 0x00 00 00 00 到 0xFF FF FF FF,总计为2 的32 次方,大小为4G。这些编号称为地址(我们是 64 位程序,地址显示的是 64 位)。
在这里插入图片描述
在变量窗口中输入sizeof(a),可以看到数组a的大小为20字节,计算方法其实就是sizeof(int)*5:数组中有 5 个整型元素,每个元素的大小为 4 字节,所以共有 20 字节。访问元素的顺序是依次从a[0]到 a[4],a[5]=6、a[6]=7 均为访问越界。下图显示了代码运行情况,从中看出,执行到第12行时,变量 i 的值被修改了,这就是访问越界的危险性——未对变量 i 赋值,其值却发生了改变!
数组另一个值得关注的地方是,编译器并不检查程序对数组下标的引用是否在数组的合法范围内。这种不加检查的行为有好处也有坏处,好处是不需要浪费时间对有些已知正确的数组下标进行检查,坏处是这样做将无法检测出无效的下标引用。一个良好的经验法则是:如果下标值是通过那些已知正确的值计算得来的,那么就无须检查;如果下标值是由用户输入的数据产生的,那么在使用它们之前就必须进行检查,以确保它们位于有效范围内。

数组的传递

#include <stdio.h>
//一维数组的传递,数组长度无法传递给子函数
//C 语言的函数调用方式是值传递
void print(int b[],int len){
   
int i;
for(i=0;i<len;i++
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值