一、初识数组
1.数组的概念
数组是由一系列类型相同的数据对象依次排列组合而成
组成数组的数据对象被称作数组的元素
重点:
- 依次排列
- 类型相同
2.声明数组
c 代码://格式:
元素类型 数组名[元素数量];
//示例:
char c[5];
int n[10];
long l[3];
float f[2];
double df[1];
3.数组初始化
c 代码://格式如下:
元素类型 数组名[元素数量] = {逗号分割的元素内容};
//示例:
int arr[10] = {1,2,3,4,5,6,7,8,9,0};
//等号右边被称为初始化列表,初始化列表写明了数组的元素分别需要被初始化为哪些值。
注意事项:
- 如果元素内容小于元素数量,那么会被自动填补为0
- 如果元素内容多于元素数量,那么将会无法编译
- 元素数量可以不填写,让初始化列表决定数组长度
4.访问数组
c 代码://格式:
数组名[下标]
//示例代码:
int arr[10] = {1,2,3,4,5,6,7,8,9,0};
printf("%d\n", arr[0]);
printf("%d\n", arr[1]);
printf("%d\n", arr[2]);
printf("%d\n", arr[3]);
printf("%d\n", arr[4]);
printf("%d\n", arr[5]);
printf("%d\n", arr[6]);
printf("%d\n", arr[7]);
printf("%d\n", arr[8]);
printf("%d\n", arr[9]);
注意事项:
- 数组下标是从0开始的,如果有九个元素,那么下标为10
5.修改数组的值
代码示例:
c 代码:int arr[10] = {};
printf("%d\n", arr[5]);
arr[5] = 123;
printf("%d\n", arr[5]);
注意事项:
- 数组越界错误
当数组元素有一个固定数量时,请勿访问或修改数组元素内以外的元素。C语言编译器不会检查数组是否越界。
- 数组不一定初始化,但是之后需要赋值,避免使用无意义数值
6.数组所占空间大小
数组所占的空间 = 单个元素所占空间大小*数组元素个数
7.数组的整体赋值
数组不能整体赋值,且初始化列表智能存在于初始化。那么如何赋值整个数组的数据呢?
有两种方法:
- 使用循环遍历赋值
int arr1[];
int arr2[1,2,3,4,5];
for (i=0;i<4;i++);
arr1[i]=arr2[i]
- 使用
memcpy
内存复制函数
//memcpy函数格式
memcpy(目标数组, 原始数组, 需要复制多少字节数据);
//示例:
memcpy(arr1, arr2, sizeof(arr1));
/*注意事项
使用memcpy函数需要引入头文件<memory.h>
假设需要复制的数据字节数为N;
目标数组大小不能小于N,否则没有足够空间存放数据;
原始数组的数据大小不能小于N,否则将复制无意义内容;
*/
8.小练习
逆序输出一组数字
c 代码:#include<stdio.h>
void main(){
int i;
int a[10] = {0};
for(i = 0;i<10;i++){
printf("输入数字:");
scanf("%d",&a[i]);
}
printf("逆序数字排列为:");
for(i = 9;i>=0;i--){
printf("%d ",a[i]);
}
}
二、二维数组
2.1 二维数组的概念
二维数组就是由多个一维数组组成的数组int score[5][10]
二维数组的每个元素都是一维数组
一维数组的每个元素表示的都是一个储存区
在定义一个二维数组的时候,需要提供两个整数
前一个整数表示一维数组的个数,后一个整数表示一维数组里的储存区个数
数据类型表示的是每个储存区的类型
int score[5][10]
//定义了1个二维数组,一共分为了5个数组.每个一维数组中有10个int类型的储存区
2.2 二维数组的格式
c 代码://格式:
元素类型 数组名[二维数组长度][一维数组长度] = {{...},{...}...};
二维数组长度 = 二维数组中有几个一维数组
一维数组长度 = 一维数组中有几个储存区
//举例:
int a[3][4] = {{1,2,3,4,},{5,6,7,8},{9,10,11,12}};
//可以把二维数组当作一维数组进行初始化,二维数组本质上还是一维数组
int mat[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int mat[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
2.3 二维数组的使用
c 代码:int mat[3][4] = {{1,2,3,4},[5,6,7,8],[9,10,11,12]};
//mat[0]表示第一个一维数组,是第一个一维数组的名字
//mat[0][1]表示访问mat[0]一维数组下标为1的储存区
二维数组名称后可以只写一个下标,这个下标作为组下标使用,这个写法可以表示组下标对应组里第一个储存区的地址
二维数组名称后加组下标也可以作为一维数组名称使用,这个一维数组里包含组下标对应组里所有的储存区
2.4 随机数
c 代码:#include <stdlib.h> //srand() rand()
#include <time.h> //time()
srand(time(0)); //设置一个随机数种子
rand() //表示一个随机的整数
rand() % 10 //表示的是0~9之间随机数
2.5 小练习
双色球
获取6个1-33之间的数字(不可重复)作为红球
获取1个1-16之间的数字作为蓝球
c 代码:#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand(time(NULL)); // 设置随机数种子
// 生成6个1-33之间的不重复的随机数作为红球
int red_balls[6];
for (int i = 0; i < 6; i++) {
int temp;
while (1) {
temp = rand() % 33 + 1;
int flag = 0;
for (int j = 0; j < i; j++) {
if (red_balls[j] == temp) {
flag = 1;
break;
}
}
if (!flag) {
red_balls[i] = temp;
break;
}
}
}
// 生成1个1-16之间的随机数作为蓝球
int blue_ball;
blue_ball = rand() % 17 + 1;
// 输出结果
printf("红球:");
for (int i = 0; i < 6; i++) {
printf("%d ", red_balls[i]);
}
printf("蓝球:%d", blue_ball);
return 0;
}