首先举个例子,输出一个4×4的整数矩阵,代码如下:
#include
#include
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 9999 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),它包含的每个数据称为数组元素(),包含数据的数量称为数组长度(),例如int a[4]; 定义了一个长度为4的整型数组,名称为a。
数组中的每个元素都有一个序号,它从0开始,而不是我们熟悉的1,称为下标(Index)。 使用数组元素时,只需指定下标,形式为:
arrayName[index]
是数组名,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
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 个数字并将它们放入一个数组中:
#include
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
第八行代码中,scanf()读取数据时需要一个地址(该地址用于指示数据的存储位置),而nums[i]代表具体的数组元素,所以我们需要在前面添加&获取地址。
最后我们总结一下数组是如何定义的:
dataType arrayName[length];
是数据类型, 是数组名称, 是数组长度。 例如:
float m[12]; //定义一个长度为 12 的浮点型数组
char ch[9]; //定义一个长度为 9 的字符型数组
必须要注意的是:
1)数组中每个元素的数据类型必须相同,对于int a[4];来说,每个元素必须是int。
2)数组的长度最好是整数或者常量表达式,比如10、20*4等,这样可以通过所有编译器运行; 如果包含变量,如n、4*m等,在某些编译器下会报错。
3)访问数组元素时,下标的取值范围为0≤index<。 如果太大或太小,都会超出限制,导致数组溢出,出现不可预测的情况。 请注意。
数组内存是连续的
数组是一个整体,其内存是连续的; 也就是说,数组的元素是相邻的,并且它们之间没有间隙。 下图演示了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:
我们可以通过以下形式将数组的所有元素初始化为 0:
int nums[10] = {0};
char str[10] = {0};
float scores[10] = {0.0};
由于其余元素会自动初始化为0,因此只需将第0个元素赋值为0即可。
2)只能给元素一一赋值,不能给整个数组赋值。 例如,要将值 1 分配给所有 10 个元素,您只能编写:
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};
当您读完文章后,别忘了再次点击阅读,转发支持小编!
扫描下方微信二维码