为什么需要数组
为了解决大量同类数据的存储和使用问题
为了模拟现实世界
例子:
int a[5] = {1, 2, 3, 4, 6};
a是数组的名字
5代表数组元素的个数,并且这5个元素分别用:
a[0],a[1],a[2],a[3],a[4],
来表示
数组的分类
> 一维数据
- 怎样定义一维数组
为n个变量连续分配存储空间
所有的变量数据类型必须相等
所有变量所占的字节大小必须相等
- 有关一维数组的操作
初始化:
完全初始化
int a[5] = {1, 2, 3, 4, 5};
不完全初始化,未被初始化的元素自动为零
int a[5] = {1, 2, 3};
不初始化,所有元素都是垃圾值
int a[5];
清零
int a[5] = {0};
错误写法:
int a[5];
a[5] = {1, 2, 3, 4, 5};//错误
只有在定义数组的同时才可以整体赋值,
其他情况下整体赋值都是错误的
int a[5] = {1, 2, 3, 4, 5};
a[5] = 100;//错误
因为没有a[5]这个元素,最大只有a[4]
int a[5] = {1, 2, 3, 4, 5};
int b[5];
如果要把a数组中的值全部复制给b数组
错误的写法:
b = a;//错误
正确的写法:
for (i = 0; i < 5; ++i)
b[i] = a[i];
注意:
int a[5];
一维数组名不代表数组中所有的元素,
一维数组名代表数组第一个元素的地址
还有其他操作:
赋值
排序
求最大/小值
倒置
查找
插入
删除
> 二维数组
- int a[3][4];
总共是12个元素,可以当做3行4列看待,这12个元素的名字依次是:
a[0][0] a[0][1] a[0][2] a[0][3]
a[1][0] a[1][1] a[1][2] a[1][3]
a[2][0] a[2][1] a[2][2] a[2][3]
a[i][j]表示 第i+1行 第j+1列 的元素
int a[m][n];该二维数组右下角位置的元素只能是a[m-1][n-1]
- 初始化
int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
或者
int a[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
}
- 输出数组内容
输出二维数组内容:
int a[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
}
int i,j;
//输出数组内容
for (i = 0; i < 3; ++i)
{
for (j = 0; j < 4; ++j)
printf("%d", a[i][j]);
printf("\n");
}
- 还有其他操作:
对二维数组排序
求每一行的最大值
判断矩阵是否对称
矩阵的相乘
> 多维数组
- 是否存在多维数组
不存在,因为内存是线性一维的
n维数组可以当做每个元素是n-1维数组的一维数组
比如:
int a[3][4]
该数组是含有3个元素的一维数组,
只不过每个元素都可以再分成4个小元素
int a[3][4][5]
该数组是含有3个元素的一维数组,
只不过每个元素都是4行5列的二维数组
例子 —— 倒置数组
/*
时间:2020年2月15日
功能:倒置数组
目的:举例
*/
#include <stdio.h>
int main(void)
{
int a[8] = {1, 2, 3, 4, 5, 6, 7, 8};
int i, j;
int t;
i = 0;
j = 7;
while (i < j)
{
t = a[i];
a[i] = a[j];
a[j] = t;
++i;
--j;
}
for (i = 0; i < 8; ++i)
printf("a[%d] = %d\n", i, a[i]);
return 0;
}
/*
在Microsoft Visual Studio 2010的过程:
-----------------------------------
a[0] = 8
a[1] = 7
a[2] = 6
a[3] = 5
a[4] = 4
a[5] = 3
a[6] = 2
a[7] = 1
请按任意键继续. . .
-----------------------------------
总结:
... ...
*/
如有不对或者疏漏的地方,请多多指出。谢谢(⁄ ⁄•⁄ω⁄•⁄ ⁄)