当前位置:网站首页>C语言数组的概念
C语言数组的概念
2022-07-06 09:25:00 【编程小鱼六六六】
在《C语言数据输出大汇总以及轻量进阶》一节中我们举了一个例子,是输出一个 4×4 的整数矩阵,代码如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a1=20, a2=345, a3=700, a4=22;
int b1=56720, b2=9999, b3=20098, b4=2;
int c1=233, c2=205, c3=1, c4=6666;
int d1=34, d2=0, d3=23, d4=23006783;
printf("%-9d %-9d %-9d %-9d\n", a1, a2, a3, a4);
printf("%-9d %-9d %-9d %-9d\n", b1, b2, b3, b4);
printf("%-9d %-9d %-9d %-9d\n", c1, c2, c3, c4);
printf("%-9d %-9d %-9d %-9d\n", d1, d2, d3, d4);
system("pause");
return 0;
}
运行结果:
20 | 345 | 700 | 22 |
56720 | 999 | 20098 | 2 |
233 | 205 | 1 | 6666 |
34 | 0 | 23 | 23006783 |
矩阵共有 16 个整数,我们为每个整数定义了一个变量,也就是 16 个变量。那么,为了减少变量的数量,让开发更有效率,能不能为多个数据定义一个变量呢?比如,把每一行的整数放在一个变量里面,或者把 16 个整数全部都放在一个变量里面。答案当然是肯定的,办法就是使用数组(Array)。
数组的概念和定义
我们知道,要想把数据放入内存,必须先要分配内存空间。放入4个整数,就得分配4个int
类型的内存空间:
int a[4];
这样,就在内存中分配了4个int
类型的内存空间,共 4×4=16 个字节,并为它们起了一个名字,叫a
。
我们把这样的一组数据的集合称为数组(Array),它所包含的每一个数据叫做数组元素(Element),所包含的数据的个数称为数组长度(Length),例如int a[4];
就定义了一个长度为4的整型数组,名字是a
。
数组中的每个元素都有一个序号,这个序号从0开始,而不是从我们熟悉的1开始,称为下标(Index)。使用数组元素时,指明下标即可,形式为:
arrayName[index]
arrayName 为数组名称,index 为下标。例如,a[0] 表示第0个元素,a[3] 表示第3个元素。
接下来我们就把第一行的4个整数放入数组:
a[0]=20;
a[1]=345;
a[2]=700;
a[3]=22;
这里的0、1、2、3就是数组下标,a[0]、a[1]、a[2]、a[3] 就是数组元素。
在学习过程中,我们经常会使用循环结构将数据放入数组中(也就是为数组元素逐个赋值),然后再使用循环结构输出(也就是依次读取数组元素的值),下面我们就来演示一下如何将 1~10 这十个数字放入数组中:
#include <stdio.h>
int main(){
int nums[10];
int i;
//将1~10放入数组中
for(i=0; i<10; i++){
nums[i] = (i+1);
}
//依次输出数组元素
for(i=0; i<10; i++){
printf("%d ", nums[i]);
}
return 0;
}
运行结果:
1 2 3 4 5 6 7 8 9 10
变量 i 既是数组下标,也是循环条件;将数组下标作为循环条件,达到最后一个元素时就结束循环。数组 nums 的最大下标是 9,也就是不能超过 10,所以我们规定循环的条件是 i<10,一旦 i 达到 10 就得结束循环。
更改上面的代码,让用户输入 10 个数字并放入数组中:
#include <stdio.h>
int main(){
int nums[10];
int i;
//从控制台读取用户输入
for(i=0; i<10; i++){
scanf("%d", &nums[i]); //注意取地址符 &,不要遗忘哦
}
//依次输出数组元素
for(i=0; i<10; i++){
printf("%d ", nums[i]);
}
return 0;
}
运行结果:
22 18 928 5 4 82 30 10 666 888
22 18 928 5 4 82 30 10 666 888
第 8 行代码中,scanf() 读取数据时需要一个地址(地址用来指明数据的存储位置),而 nums[i] 表示一个具体的数组元素,所以我们要在前边加 & 来获取地址。
最后我们来总结一下数组的定义方式:
dataType arrayName[length];
dataType 为数据类型,arrayName 为数组名称,length 为数组长度。例如:
float m[12]; //定义一个长度为 12 的浮点型数组
char ch[9]; //定义一个长度为 9 的字符型数组
需要注意的是:
1) 数组中每个元素的数据类型必须相同,对于int a[4];
,每个元素都必须为 int。
2) 数组长度 length 最好是整数或者常量表达式,例如 10、20*4 等,这样在所有编译器下都能运行通过;如果 length 中包含了变量,例如 n、4*m 等,在某些编译器下就会报错,
3) 访问数组元素时,下标的取值范围为 0 ≤ index < length,过大或过小都会越界,导致数组溢出,发生不可预测的情况,请大家务必要引起注意。
数组内存是连续的
数组是一个整体,它的内存是连续的;也就是说,数组元素之间是相互挨着的,彼此之间没有一点点缝隙。下图演示了int a[4];
在内存中的存储情形:
「数组内存是连续的」这一点很重要,所以我使用了一个大标题来强调。连续的内存为指针操作(通过指针来访问数组元素)和内存处理(整块内存的复制、写入等)提供了便利,这使得数组可以作为缓存(临时存储数据的一块内存)使用。大家暂时可能不理解这句话是什么意思,等后边学了指针和内存自然就明白了。
数组的初始化
上面的代码是先定义数组再给数组赋值,我们也可以在定义数组的同时赋值,例如:
int a[4] = {20, 345, 700, 22};
数组元素的值由{ }
包围,各个值之间以,
分隔。
对于数组的初始化需要注意以下几点:
1) 可以只给部分元素赋值。当{ }
中值的个数少于元素个数时,只给前面部分元素赋值。例如:
int a[10]={12, 19, 22 , 993, 344};
表示只给 a[0]~a[4] 5个元素赋值,而后面 5 个元素自动初始化为 0。
当赋值的元素少于数组总体元素的时候,剩余的元素自动初始化为 0:
- 对于short、int、long,就是整数 0;
- 对于char,就是字符 '\0';
- 对于float、double,就是小数 0.0。
我们可以通过下面的形式将数组的所有元素初始化为 0:
int nums[10] = {0};
char str[10] = {0};
float scores[10] = {0.0};
由于剩余的元素会自动初始化为 0,所以只需要给第 0 个元素赋值为 0 即可。
2) 只能给元素逐个赋值,不能给数组整体赋值。例如给 10 个元素全部赋值为 1,只能写作:
int a[10] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
而不能写作:
int a[10] = 1;
3) 如给全部元素赋值,那么在定义数组时可以不给出数组长度。例如:
int a[] = {1, 2, 3, 4, 5};
等价于
int a[5] = {1, 2, 3, 4, 5};
最后,我们借助数组来输出一个 4×4 的矩阵:
#include <stdio.h>
int main()
{
int a[4] = {20, 345, 700, 22};
int b[4] = {56720, 9999, 20098, 2};
int c[4] = {233, 205, 1, 6666};
int d[4] = {34, 0, 23, 23006783};
printf("%-9d %-9d %-9d %-9d\n", a[0], a[1], a[2], a[3]);
printf("%-9d %-9d %-9d %-9d\n", b[0], b[1], b[2], b[3]);
printf("%-9d %-9d %-9d %-9d\n", c[0], c[1], c[2], c[3]);
printf("%-9d %-9d %-9d %-9d\n", d[0], d[1], d[2], d[3]);
return 0;
}
喜欢分享小游戏的UP主 记得关注我噢!源码及素材进群获取~:828339809 记得一键三连!一键三连!一键三连!
边栏推荐
- ucorelab4
- What are the commonly used SQL statements in software testing?
- MATLAB综合练习:信号与系统中的应用
- Learning record: USART serial communication
- C4D quick start tutorial - creating models
- How to change XML attribute - how to change XML attribute
- Cost accounting [19]
- LeetCode#62. Different paths
- What is "test paper test" in software testing requirements analysis
- China chart recorder market trend report, technology dynamic innovation and market forecast
猜你喜欢
Do you know the performance testing terms to be asked in the software testing interview?
How to do agile testing in automated testing?
Brief introduction to libevent
ucore lab7
What to do when programmers don't modify bugs? I teach you
UCORE lab5 user process management experiment report
How to build a nail robot that can automatically reply
Learning record: USART serial communication
学习记录:使用STM32F1看门狗
动态规划前路径问题优化方式
随机推荐
CSAPP shell lab experiment report
Learning record: understand systick system timer and write delay function
Es6--- two methods of capturing promise status as failed
学习记录:使用STM32F1看门狗
UCORE LaB6 scheduler experiment report
学习记录:TIM—基本定时器
学习记录:使用STM32外部输入中断
Cost accounting [20]
学习记录:如何进行PWM 输出
China chart recorder market trend report, technology dynamic innovation and market forecast
[C language] twenty two steps to understand the function stack frame (pressing the stack, passing parameters, returning, bouncing the stack)
JS --- BOM details of JS (V)
China medical check valve market trend report, technical dynamic innovation and market forecast
How to do agile testing in automated testing?
Research Report on medical anesthesia machine industry - market status analysis and development prospect prediction
China's PCB connector market trend report, technological innovation and market forecast
Mysql database (V) views, stored procedures and triggers
MySQL transactions
学习记录:USART—串口通讯
Research Report on printed circuit board (PCB) connector industry - market status analysis and development prospect forecast