前言:
C语言中有基本类型(整形、字符型、实型)的数据,也有构造类型(数组类型、结构体类型和共用体类型)的数据。
构造体类型数据是由基本类型数据按一定规则组成的,又可以叫做导出类型。
一、 一维数组的定义和引用
1.1 一维数组的定义
数据类型 数组名[n]
例:int arry[10] //定义了一个整型数组,数组名为arry,含有十个元素。
注意:
1.数组名命名规则和变量名相同,遵循标识符命名规则,
2.n中需要的是一个整形长量或者整形常量表达式。(ps:C89之前是这样,但C90增加了柔性数组这一概念,变量也可以。但从兼容性考虑,建议不要使用变量。)
1.2 数组的访问
数组名[下标]
注意:
1.数组必须先定义,然后再使用。C语言中只能逐个引用数组元素不能整体引用数组。
2.下标:从0开始,到N-1(数组元素为N)结束
3.可以常量、变量、表达式
1.3 数组的初始化
初始化不等于赋值;
1)全部初始化 (定义同时赋值)
int arry[5] = {0, 1, 2, 3, 4, 5};
要求数量一致,类型匹配
2)局部初始化
int arry[5] = {0, 1, 2};
int arry[5] = {0}
按顺序给元素赋值,没有初始化的元素全部为0;
3)默认初始化
int arry[] = {0, 1, 2, 3, 4, 5};
n不写的话则默认元素个数为数组长度(初始化时列表内值的数量决定)
n的范围要保证位于[0,N - 1]内,不然会发生数据越界问题,难以排查。
1.4 数组的存储特性
1)单一性
数组中所有的元素类型必须相同
2)有序性
元素在内存中是有序存放的,按数组元素编号顺序排列
3)连续性
元素在内存中是连续存放的
1.5 数组的常见操作
1)遍历比较
例:定义一个整形数组并初始化,找到数组中的最大值打印出来。
tips:
max选择arry[0]的原因,不用0是因为数组可能全为负数,不用arry[]其他元素是因为不确定数组元素个数,可能发生越界。为了可移植性考虑,其中for退出循环的条件可以修改为数组长度,即sizeof(arry)/ sizeof(arry[0])。
#include <stdio.h>
int main(void)
{
int arry[5] = {12, 11, 23, 4, 21};
int i = 0;
int max = arry[0];
for (i = 0; i < 5; i++)
{
if (max < arry[i])
{
max = arry[i];
}
}
printf("max = %d\n", max);
return 0;
}
例:数组倒置
#include<stdio.h>
int main(void)
{
int i = 0, tmp = 0;
int a[5] = {1, 2, 3, 4, 5};
int len = sizeof(a) / sizeof(a[0]);
for (i = 0; i < len - 1 - i; i++)
{
tmp = a[i];
a[i] = a[len-1-i];
a[len - 1 - i] = tmp;
}
for (i = 0; i < len; i++)
{
printf("%d", a[i]);
}
putchar('\n');
return 0;
}
二. 数组的排序
1)冒泡排序
原理:
相邻两个元素间进行比较,大的数据向后放,小的往前放(升序)
#include<stdio.h>
int main(void)
{
int i = 0, j = 0, tmp = 0;
int a[5] = {11, 32, 1, 4, 9};
int len = sizeof(a) / sizeof(a[0]);
for (j = 0; j < len-1 ; j++)
{
for (i = 0; i < len-1-j; i++)
{
if(a[i] > a[i+1])
{
tmp = a[i];
a[i] = a[i + 1];
a[i + 1] = tmp;
}
}
}
for (i = 0; i < len; i++)
{
printf("%d ", a[i]);
}
return 0;
}
2.选择排序
原理: 遍历每个位置,为每个位置选择一个合适的值;即第一次从待排序中的数组元素选出最大或最小的一个元素放到序列的起始位置,再从剩余元素中找到最大或最小的一个元素放到已排序的序列末尾,由此类推,直到待排序元素个数为0.
#include<stdio.h>
int main(void)
{
int a[10] = {1,3,2,5,6,4,9,7,8,0};
int i = 0, j = 0, tmp = 0;
int len = sizeof(a) / sizeof(a[0]);
for (i = 0; i < len-1; i++)
{
for (j = i+1; j < len; j++)
{
if(a[i] > a[j])
{
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
}
for (i = 0; i<len; i++)
{
printf("%d ", a[i]);
}
return 0;
}