数组
今天的大标题很简单,就两个字,但包含的东西可是不少,废话少数,直接开学!
1.什么是数组
数组就是一组相同类型元素的集合:
*存放一个或多个数组,元素个数不为0;
*存放的数据类型是相同的
数组分为一维数组和多维数组,多维常见的就是二维数组
2.数组的创建和初始化
创建
type arr_name[常量值];
类型 数组名字 大小
数组在创立的时候就指定数组的大小和数组的元素类型
类型可以是:char、short、int、float等,也可以是自定义的
名字就根据实际情况来取,有意义,方便自己观察即可,如年龄的数组可以用age
[ ]中的常数值就是来制定数组的大小
初始化
一般使用大括号
int arr[5] = {1,2,3,4,5}; //完全初始化
int arr2[6] = {2};//不完全初始化,第一个元素是2,后面默认初始化为0
int arr3[3] = {1,2,3,4};//错误初始化,只能放3个却放了4个,造成数据越位
数组的类型
数组中的元素有类型,数组本身也有类型,数组算是一种自定义的类型,去掉数组名后就是数字的类型
如
int arr[10]; 的类型就是 int [10]
3.数组怎么使用
知道了怎么创建和初始化数组,那我们创建好的数组要怎么去使用呢?
先引入一个概念:数组下标
小标从0开始到n-1结束
数组元素 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
对于数组的访问有一个新的操作符:下标引用操作符 [ ]
arr[7]就是数组下标为7的元素
以下面简单的代码为例就很好理解
#include<stdio.h>
int main() {
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("%d\n", arr[3]);//4
printf("%d\n", arr[9]);//10
return 0;
}
for循环访问整个数组(输入和输出)
#include<stdio.h>
int main() {
int arr[10] = { 0 };
int i = 0;
for (i = 0; i < 10; i++) {
scanf("%d", &arr[i]);
}
for (i = 0; i < 10; i++) {
printf("%d ", arr[i]);
}
}
当然,scanf和printf可以放在同一个for循环里面
4.数组在内存中的存储
计算机会把所有的数据都放在内存处理
内存又会被划分成一个个内存单位,一个内存单位的大小是一字节
内存单位可以通过编号找到其在内存中的具体位置
(编号==地址==C语言中的指针)
每次产生的地址都不一样
下面是打印出数组元素地址的代码
#include<stdio.h>
int main() {
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
for (i = 0; i < 10; i++) {
printf("&arr[%d] = %p\n", i, &arr[i]);
}
return 0;
}
可以看出哪怕代码数据一样,在内存中开辟的空间位置也不一样
注意:
*每个相邻的元素之间差距是4(一个整形四个字节),所以数组中是元素是连续存放的
5.计算数组中元素个数
我们知道sizeof可以计算类型或者变量的大小,它也可以计算数组的大小
#include<stdio.h>
int main() {
int arr[10] = { 0 };
printf("%d", sizeof(arr));
return 0;
}
上诉代码的输出结果是40(字节)
个数*单位大小==总量大小
sizeof既然可以计算数组大小也可以计算数组中单个元素的大小
sizeof(arr[0]);
那元素个数就是:sizeof(arr)/ sizeof(arr[0])
#include<Stdio.h>
int main() {
int arr[10] = { 0 };
//printf("%d", sizeof(arr));
int sz = sizeof(arr) / sizeof(arr[0]);
printf("%d", sz);
return 0;
}
//输出10
好处:通过公式而不是具体的数字来表示数组元素个数,这样无论数组个数怎么变化,公式结果随着改变,大大增强了代码应对“变化”的能力。
6.二维数组
说完一维数组,那二维数组是什么?
二维数组是将一维数组作为元素是数组,以此类推,三维数组就把二维数组作为元素是数组
1 | 1 | 2 | 3 | 4 | 5 | 1 | 2 | 3 | 4 | 5 | ||
int | int | int | int | int | int | 2 | 3 | 4 | 5 | 6 | ||
数组元素 | 一维数组 | 3 | 4 | 5 | 6 | 7 | ||||||
int | int | int | int | int | ||||||||
二维数组 |
创建
和一维数组一样
type arr_name[常量值1][常量值2];
常量值1表示行数。常量值2表示列数
初始化
一样使用{}初始化
int arr1[3][5] = {1,2};
int arr1[3][5] = {0};
不完全初始化后
0 | 1 | 2 | 3 | 4 | 0 | 1 | 2 | 3 | 4 | |||
0 | 1 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | |
2 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | |
arr1数组 | arr2数组 |
完全初始化
int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6 3,4,5,6,7};
按照行初始化
可以把数据更准确的放入
int arr4[3][5] = {{1,2},{3,4},{5,6}};
0 | 1 | 2 | 3 | 4 | |
0 | 1 | 2 | 0 | 0 | 0 |
1 | 3 | 4 | 0 | 0 | 0 |
2 | 5 | 6 | 0 | 0 | 0 |
arr4数组 |
*初始化是省略行,不能省略列
省行不省列
计算机是可以通过数据内存来决定行
int arr5[][5] = {1,2,3};
7.二维数组的使用
下标
同一维数组一样,二维数组也有下标
行与列的下标均从0开始
通过行列下标的结合,我们可以快速定位到二维数组中的数据
输入输入和存储位置
因为在一维数组中已经讲过,下面博主将用一个代码同时实现这三个功能
#include<stdio.h>
int main() {
int arr[3][5] = { 0 };
//采用双for循环实现输入
int i = 0;
int j = 0;
for (i = 0; i < 3; i++) {
for (j = 0; j < 5; j++) {
scanf("%d", &arr[i][j]);
}
}
for (i = 0; i < 3; i++) {
for (j = 0; j < 5; j++) {
printf("%2d", arr[i][j]);
}
printf("\n");
}
for (i = 0; i < 3; i++) {
for (j = 0; j < 5; j++) {
printf("&arr[%d][%d] = %p\n", i,j,&arr[i][j]);
}
printf("\n");
}
return 0;
}
**每个相邻的元素之间差距是4(一个整形四个字节),所以二维数组中是元素是连续存放的
是不是觉得这句话很熟悉,没错,这就是一维数组的性质,博主直接复制粘贴
*二维数组的每个元素都是一维数组
8.C99中的变长数组
这只是做一个扩展,因为在vs中实现不了
int n = a+b;
int arr[n];
将数组的大小不在初始化时确定(变长数组不能初始化),而是在程序运行的时候精准的去分配内存。当然这不是说数组大小可变,数组的大小一旦确定就不会变。
9.结束语
今天的学习就先到这里吧,后续还有两个例题分享给大家,博主会加班加点赶出来的!
希望大家可以喜欢!