一、数组的概念
1、在程序设计中,为了方便处理数据把具有相同类型的若干变量按有序形式组织起来,这些按序排列的 同类数据元素的集合称为数组。
2、在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是 基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针 数组、结构数组等各种类别。本章介绍数值数组和字符数组,其余的在以后各章陆续介绍。
3、总结:
3.1 数组中的元素是连续的(元素的内存地址连续)。
3.2 同一个数组的所有成员都是相同的数据类型。
二、一维数组
1、一维数组的定义
1.1、一维数组的定义语法规则
数据类型 数组名 [常量表达式];
说明:
(1)数组名的命名规范必须满足“标识符的命名规范”
(2)方括号中的常量表达式就是数组的长度,也就是数组中存储元素的个数
例如:
int a[10]; 说明整形数组a,有10个元素。
float b[10] , c[20]; 说明实型数组b,有10个元素,实型数组c,有20个元素。
char ch[20]; 说明字符数组ch,有20个元素。
1.2、一维数组的使用
使用下标访问数组中的元素
(1)下标的值必须为整形常量/变量。
(2)下标的值从0开始 到数组长度-1结束。
注意:如果使用的下标值大于或者等于数组长度,程序仍然可以编译通过,但是运行结果 是未知的。
1.3、数组的初始化
给数组赋值的方法除了用赋值语句对数组元素逐个赋值外,还可采用初始化赋值和动态赋值的方法。
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };//定义一个数组,同时初始化所有成员变量
int a[10] = { 1, 2, 3 };//初始化前三个成员,后面所有元素都设置为0
int a[10] = { 0 };//所有的成员都设置为0
[]中不定义元素个数,定义时必须初始化
int a[] = { 1, 2, 3, 4, 5 };//定义了一个数组,有5个成员
注意:局部数组如果不初始化,内容为随机值。
/*
一维数组的使用以及数组是如何遍历的
*/
#include <stdio.h>
int main()
{
int a[10]; //定义了一个int类型的数组,数组名叫a,其中有10个成员。
int i = 0;
for(i=0;i<10;i++)
{
a[i] = i; //给数组赋值。
}
printf("数组初始化完毕\n");
//遍历数组,并输出每个成员的值
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
printf("\n");
printf("done!\n");
return 0;
}
1.4、一维数组元素在内存中的存储
/*
数组的各种初始化方式及大小计算
*/
#include <stdio.h>
int main()
{
int a[10] = {1,2,3}; //10表示数组的大小
int data;
int array[] = {100,200,300,400,500};
int size;
int b[10] = {0};
/*
1.把整个数组的大小,除以数组中一个元素的大小,就可以获得总个数.
2.sizeof关键字,能计算括号中对应数据的内存空间大小
*/
size = sizeof(array)/sizeof(array[0]);
printf("array的个数有:%d\n",size);
for(data=0;data<size;data++)
{
printf("address:%p\n",&array[data]); //输出内存地址信息
printf("data:%d\n",array[data]);
}
return 0;
}
补充:通过**sizeof(数组名)**可以求数组在内存中占用的字节数 。
2、一维数组应用举例
2.1 一维数组的逆置(逆序输出)
/*
数组的逆序输出
*/
#include <stdio.h>
int main()
{
int a[] = {1,2,3,4,5,6,7,8,9,10}; //定义一个数组,同时初始化所有成员变量
int i = 0;
int j = sizeof(a)/sizeof(a[0])-1;
int tmp;
while(i<j)
{
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
i++;
j--;
}
for(i=0;i<sizeof(a)/sizeof(a[0]);i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
2.2、删除一维数组中的指定元素
#include <stdio.h>
int main()
{
int i;
int j;
int x;
int a[] = {1,2,3,4,5,6,7,8,9,10};
printf("请输入要删除的数\n");
scanf("%d",&x);
for(i=0;i<10;++i)
{
if(x==a[i])
{
for(j=i;j<9;++j){ //删除指定的数
a[j] = a[j+1];
}
a[9] = 0;
break;
}
}
if(i==10){
printf("没有找到指定的数\n");
}else{
for(i=0;i<9;++i){ //输出删除后的数组
printf("%d ",a[i]);
}
}
return 0;
}
2.3、斐波那契数列
/*
斐波那契数列(线性递推数列)
*/
#include <stdio.h>
int main()
{
int array[30];
int i;
int arraySize;
arraySize = sizeof(array)/sizeof(array[0]);
array[0] = 0;
array[1] = 1;
for(i=2;i<arraySize;i++)
{
array[i] = array[i-1]+array[i-2];
}
for(i=0;i<arraySize;i++)
{
printf("%d \n",array[i]);
}
printf("\ndone\n");
return 0;
}
2.3、冒泡排序法
/*
冒泡排序法(从小到大)
*/
#include <stdio.h>
int main()
{
int array[] = {12,34,45,56,76,87,98,100};
int i,j,tmp;
int ArraySize = sizeof(array)/sizeof(array[0]);
for(i=0;i<ArraySize-1;i++)
{
for(j=0;j<ArraySize-1-i;j++){
if(array[j] > array[j+1])
{
tmp = array[j];
array[j] = array[j+1];
array[j+1] = tmp;
}
}
}
for(i=0;i<ArraySize;i++)
{
printf("%d ",array[i]);
}
return 0;
}
/*
冒泡排序法(从大到小)
*/
#include <stdio.h>
int main()
{
int array[] = {12,34,45,56,76,87,98,100};
int i,j,tmp;
int ArraySize = sizeof(array)/sizeof(array[0]);
for(i=0;i<ArraySize-1;i++)
{
for(j=0;j<ArraySize-1-i;j++){
if(array[j] < array[j+1]) //修改此处的关系运算符就可改变输出排序是从大到小或者从小到大
{
tmp = array[j];
array[j] = array[j+1];
array[j+1] = tmp;
}
}
}
for(i=0;i<ArraySize;i++)
{
printf("%d ",array[i]);
}
return 0;
}
三、二维数组
1、二维数组的定义
(1)在实际应用中有许多数据是二维的,例如棋盘是有多行多列,如果使用C语言描述一个棋盘我们 需要使用二维数组。
(2)定义二维数组的语法规则
数据类型 数组名[常量表达式1][常量表达式2];
说明:
1)我们可以将二维数组当作一个有行有列的二维 矩阵
2)常量表达式1代表矩阵的行数
3)常量表达式2代表矩阵的列数
4)二维数组可以理解为由 “常量表达式1”个一维数组所组成的
(3)int a[3][4];
数组a是一个有3行4列的二维数组,数组中元素的数据类型为int
2、二维数组的使用
2.1二维数组也同样通过下标对数组中的元素进行访问,与一维数组不同的是,二维数组元素的访问需要使用两个下标(1)行下标的值从0 开始到“常量表达式1”-1(2)列下标的值从0开始到“常量表达式2”-1(3)通过双重循环访问二维数组中的元素
/*
二维数组的使用(基本访问方法)
*/
#include <stdio.h>
int main()
{
int a[2][3];
int m,n;
//一行一行的访问
for(m=0;m<2;m++)
{
for(n=0;n<3;n++)
{
printf("%d",a[m][n]);
}
printf("\n");
}
//一列一列的访问
for(m=0;m<2;m++)
{
for(n=0;n<3;n++)
{
printf("%d",a[n][m]);
}
printf("\n");
}
return 0;
}
/*
二维数组的使用(二维数组的遍历)
*/
#include <stdio.h>
int main()
{
int i,j,hang,lie;
//定义一个3X4整型二维数组
int arry[3][4] = {{11,22,33,44},{111,222,333,444},{1111,2222,3333,4444}};
int max;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++){
printf("%d \t",arry[i][j]);
}
printf("\n");
}
max = arry[0][0]; //最大的那个数,先记录第一个来比较的数字
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
if(max < arry[i][j]) //如果记录的数比当前这个数小,那么重新记录这个数
{
max = arry[i][j];
hang = i;
lie = j;
}
}
}
printf("其中在%d行第%d列的数%d最大\n",hang+1,lie+1,max);
return 0;
}