数组
为什么需要数组
为了解决大量同类型数据的存储和使用问题
为了模拟现实世界
1 # include <stdio.h> 2 3 int main() 4 { 5 int a[5] = {1, 2, 3, 4, 5};//a是数组的名字,5表示数组元素的个数,并且这5个元素分别用a[0] ,a[1],a[2],a[3],a[4]表示 6 int i; 7 8 for(i=0; i<5; ++i) 9 printf("%d\n",a[i]);//a[i]表示数组a中第i+1个元素 10 11 printf("%d\n",a[100]);//数组a中没有第101个元素,所以输出的值为0,这是因为a[100]不属于数组a,使用了一个不属于它的空间,正好空间内有一个值,用十进制表示正好是0(或者是其它数字,编译器规定为0) 12 13 return 0; 14 } 15 /* 16 在Dev-C++ 5.11中的输出结果是: 17 ================ 18 1 19 2 20 3 21 4 22 5 23 0 24 ================ 25 */
数组的分类
一维数组
怎样定义一维数组
-
为n个变量连续分配存储空间
-
所有的变量数据类型必须相同
-
所有变量所占的字节大小必须相等
有关一维数组的操作
初始化
-
完全初始化
int a [5] = {1, 2, 3, 4, 5};
-
不完全初始化(未被初始化的元素自动为零)
int a [5] = {1, 2, 3};
-
不初始化 (所有元素都是垃圾值)
int a [5];
-
清零
int a [5] = {0};//数组a中5个元素都为0
-
错误写法
-
int a[5];
a[5] = {1, 2, 3, 4, 5};//这样写是错误的,因为a[5]只有在定义数组的时候表示定义了一个数组a,元素是5个,其它情况下a[5]只表示数组a中第6个元素
-
int a[5] = {1, 2, 3, 4, 5};
a[5] =100;//因为数组a中没有a[5] 这个元素,最大是a[4]
-
int a[5] = {1, 2, 3, 4, 5};
int b[5];
如果要把a数组中的值全部复制给b数组,
错误的写法:
b = a;//错误,因为数组名a不代表数组a内的所有元素,而是代表数组a内第一个元素的地址
正确的写法:
for(i=0; i<5; ++i )
b[i] = a[i];
-
赋值
1 # include <stdio.h> 2 3 int main() 4 { 5 int a[5]; 6 int i; 7 8 scanf("%d",&a[0]); 9 printf("a[0]=%d\n",a[0]); 10 11 scanf("%d",&a[3]); 12 printf("a[3]=%d\n",a[3]); 13 14 for(i=0; i<5; ++i) 15 printf("%d\n",a[i]); 16 17 return 0; 18 } 19 /* 20 在Dev-C++ 5.11中的输出结果是: 21 ================ 22 1 23 a[0]=1 24 2 25 a[3]=2 26 1 27 0 28 34 29 2 30 44766064 31 ================ 32 键盘输入1,2,输出结果如上所示,for循环输出之所以有垃圾值,是因为数组a未初始化,所以输出为垃圾值 33 */
排序
求最大值/最小值
倒置
1 # include <stdio.h> 2 3 int main() 4 { 5 int a[8] = {1, 2, 3, 4, 5, 6, 7, 8}; 6 int i, j; 7 int tem; 8 9 i = 0; 10 j = 7; 11 while(i<j) 12 { 13 tem = a[j]; 14 a[j] = a[i]; 15 a[i] = tem; 16 17 ++i; 18 j--; 19 } 20 21 for(i=0; i<8; ++i) 22 printf("%d\n",a[i]); 23 24 return 0; 25 } 26 /* 27 在Dev-C++ 5.11中的输出结果是: 28 ================ 29 8 30 7 31 6 32 5 33 4 34 3 35 2 36 1 37 ================ 38 */
查找
插入
删除
二维数组
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 [3] [4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
int [3] [4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
操作
输出二维数组的内容
1 #include <stdio.h> 2 3 int main() 4 { 5 int i, j; 6 int a[3][4] = { 7 {1, 2, 3, 4}, 8 {5, 6, 7, 8}, 9 {9,10,11,12} 10 }; 11 12 for(i=0; i<3; ++i) 13 { 14 for(j=0; j<4; ++j) 15 printf("%-5d ",a[i][j]);//对了让打印数字对齐,在打印输出时,输出控制符设置为"%-5d ",其负号表示左对齐,5表示占5个光标的位置,空格表示输出后面加一个空格 16 printf("\n"); 17 } 18 19 return 0; 20 } 21 /* 22 在Dev-C++ 5.11中的输出结果是: 23 ================ 24 1 2 3 4 25 5 6 7 8 26 9 10 11 12 27 ================ 28 */
对二维数组排序
求每一行的最大值
判断矩阵是否对称
矩阵的相
多维数组
是否存在多维数组
不存在,因为内存是线性一维的
n维数组可以当做每个元素是n-1维数组的一维数组
例
int [3] [4]
该数组是含有3个元素的一维数组,只不过每个元素都可以在分成4个小元素
int [3] [4] [5]
该数组是含有3个元素的一维数组,只不过每个元素都是4行5列的二维数组