我们今天讲解的是数组,它是C语言提供的构造类型数据的其中之一。
数组
在数组中的元素遵循三条性质:
1.单一性:数组中的每一个元素都属于同一个数据类型。
2.连续性:数组中的连续元素所占的空间也是连续的。
3.有序性:按照下标的编号,越小的编号元素 。
一维数组
一维数组的定义方式
“类型说明符” :指的是数组里元素数据的类型,比如说经常使用的有int型,float型等,但需要强调的是不能是空类型。
“数组名”:指的是数组的名字,和标识符的命名规则通用。
“[ ]”:在定义层,这是一个类型说明符,表示这是一个数组。
“ 常量表达式”:需要注意的是这是一个无符号整型常量。
一维数组的引用与初始化
我们表示数组元素的方式是:
这时,使用的“ [ ]”和定义层的用法不同,定义层是意在强调这是个数组,而在表示数组元素时,这是一个下标运算符,用来引用序号为“[ 里 ] ”的元素。
数组不可以被直接整体引用,或直接整体赋初值,如:a[10] = 10。C语言是通过去除变量名,留下类型名来进行格式检查的,这时检测会发生格式报错。
在数组名单独出现的时候,其代表的是数组首元素的首地址!注意不是数组的首地址哦!
在定义数组的时候,数组长度为元素个数 * 元素类型的所占字节,而对数组里各元素进行赋值的时候,要记得数组下标的取值是[0,元素个数-1]。
当我们给数组赋初值时,下标超过定义范围会导致越界,此时空间有可能会被别的变量使用,发生很严重的错误。
给数组元素赋初值有以下几种方法:
使用这种方法时注意不要越界
使用这种方法,剩下没有赋初值的元素均为0。
一维数组的各种应用
一维数组的逆序
#include<stdio.h>
int main (void)
{
int i , t , len;
int a[] = {1,2,3,4,5,6,7};
len = sizeof(a) / sizeof(a[0]);
for(i = 0 ; i < len / 2 ; ++i)
{
t = a[i];
a [i] = a [len - 1 - i];
a [len - 1 - i] = t;
}
for (i = 0 ; i < len; ++i)
{
printf("%d\n",a[i]);
}
}
这个程序是用前后交换的方式,将元素逆序进行排列。交换次数为数组元素个数除以2,然后依次进行交换。定义一个 t 来保存交换前的数组元素。
运行结果如下:
一维数组的选择排序
int main (void)
{
int a [] = {1,5,7,3,8,4,9};
int i,j;
int len,t;
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])
{
t = a[i];
a [i] = a [j];
a [j] = t;
}
}
}
for (i = 0; i < len ; ++i)
{
printf(" %d ",a[i]);
}
printf("\n");
return 0 ;
}
这种排序方式是用在不同的范围里分别求最小值,存放在前置,一轮循环只进行一次元素交换。
运行结果如下:
一维数组的冒泡排序
int main (void)
{
int i,j,len;
int a [] = {1,4,6,3,7,9,5};
len = sizeof(a) / sizeof(a[0]);
for (j = len - 1; j > 0 ; --j)
{
for (i = 0 ; i < j ; ++i)
{
if (a [i] > a [i + 1])
{
int t;
t = a [i];
a[i] = a[i+1];
a[i + 1] = t;
}
}
}
for (i = 0 ; i < len ; ++i)
{
printf("%d ",a[i]);
}
printf("\n");
}
这种排序方式是利用2个相邻元素进行两两比较,小的元素数据放在前面,大的在后。每一轮有多个元素进行交换。
运行结果如下:
一维数组的插入法排序
int main(void)
{
int a [] = {3,5,6,1,2,9,7};
int len;
len = sizeof(a)/sizeof(a[0]);
int b [len];
b[0] = a [0];
int i;
for (i = 1 ; i < len ; ++i)
{
int j = i;
int t = a [i];
while(j > 0 && b[j - 1] > t)
{
b [j] = b [ j - 1];
--j;
}
b[j] = t;
}
for (i = 0 ; i < len ; ++i)
{
a[i] = b[i];
}
for (i = 0 ; i < len;++i )
{
printf(" %d ",a[i]);
}
printf("\n");
return 0 ;
}
这种方法是定义另一个空白的数组来进行存放排好顺序的原数组,后再重新赋值给原数字,达到给原数组重新排序的效果。
运行结果如下:
感谢你的阅读!如有遗漏和错误,请大佬在评论区进行批评指正!!!