前言
大家好,今天我们来讲解一下有关数组的简单知识。
一、数组是什么?
数组是一段连续空间上相同类型数据的集合。
int a = 0;//这是一个整形变量
当我们只需要存储5个数据的时候我们当然可以创建5个变量,
但是如果我们是要统计全班50个同学的成绩,那我们再创建50个变量就不是那么方便了,
在往上要统计全校2000名学生的成绩呢?这个时候只是命名就够我们头疼一阵的,
这时数组的简洁性就体现出来了
代码如下(示例):
int arr[50] = { 0 };//能够存放50个整形数据的数组
int arr[2000] = { 0 };//存放2000个整形数据
1、数组可以创建为任意类型,例如:int,char,double等
2、数组可以通过下标进行访问,下标运算符为:[ ];
这里需要注意的是 数组的下标是从 0 开始的,
也就是说创建一个数组: int arr[5] = { 0 };
arr[0]是数组的第一个元素,arr[1]是数组的第二个元素,
以此类推,数组的最后一个元素为arr[4] 而不是 arr[5]
3、数组元素存储在一块连续的内存空间
这里要用到 取地址运算符:&(取出该变量在内存中存储空间的首地址);
如图 &arr[0] = 0xE33AF450;(0x开头为16进制)
大家知道一个整形变量占四个字节,那么每往后一个元素,它的首地址都会增加4
二、习题练习:
1.求10名学生中的最高成绩
代码如下(示例):
#include<stdio.h>
int main() {
int arr[10] = { 0 };
puts("请输入10名学生的成绩。");//puts("");输出字符串并换行
int i = 0;
for (i = 0; i < 10; i++) {
printf("arr[%d] = ", i);
scanf("%d", &arr[i]);
}
int max = arr[0];//将第一名学生的成绩赋给max
for (i = 1; i < 10; i++) {//从第二个学生开始比较
if (max < arr[i])
max = arr[i];
}
printf("最高分为:%d\n", max);
return 0;
}
2.对5名学生的成绩升序排序
代码如下(示例):
#include<stdio.h>
int main() {
int arr[5] = { 0 };
int i = 0;
puts("请输入5名学生的成绩。");
for (i = 0; i < 5; i++) {
printf("arr[%d] = ", i);
scanf("%d", &arr[i]);
}
for (i = 0; i < 4; i++) { //冒泡排序
for (int j = 0; j < 5 - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int z = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = z;
}
}
}
puts("通过冒泡排序进行升序。");
for (i = 0; i < 5; i++)
printf("arr[%d] = %d\n", i, arr[i]);
printf("\n");
return 0;
}
三、特别注意:
1.数组名的使用有两种特例
第一种是sizeof(数组名),这里的数组名代表整个数组,求出来的是整个数组所占的字节数
第二种是&数组名,这里的数组名代表的是整个数组的地址,求出的是整个数组的地址大小
除了以上两种情况,其他数组名都表示首元素的地址。
2.int arr[] = {0, 1, 2, 3, 4};
此处初始化时省略了数组的大小,编译器就会根据我们初始化时的数据个数自动初始化数组大小,
此处就初始化为arr[5]。
由此可见数组的个数是可以省略的,但是要注意多维数组的省略方式
例如:int arr[3][4] = { 0 };这是一个三行四列数组,我们可以把它看做元素类型为 int [4],元素个数为3的数组
这里同样可以省略元素个数写成 int arr[ ][4] = { 1,2,3,4,5,6 }; 此时元素个数为 2
同理得 int arr[ ][4][5] = { 1,2,3,4,5,6 }; 元素类型为 int [4][5] ,元素个数为 1
但是注意不能写成 int arr[3][] = { 1,2,3,4,5,6 }; 这样写的话相当于元素类型不明确,编译器不知道应该如何分配这些整数。
3.数组作为参数传递时传递的是元素首地址,而不是整个数组
所以如果在被调用函数中使用 sizeof(arr)/ sizeof(arr[0]) 这样是算不出来元素个数的,
数组作为参数传递时是不可能传过去整个数组的,所以如果在传参时需要将元素个数一并传出。
总结
今天的第一部分所讲是数组最基本的知识,第三部分难度有所提高,下一篇博客我们再详细探讨,
今天就到这里,谢谢大家。