深入解析:嵌入式学习Day7
第7章 数组(*重难点)
1.一维数组
格式:
类型说明符 数组名[整型表达式];
例:float f[10000];
数组在内存中存放的三大特性:
1)单一性:每个元素占用的空间相同
2)连续性:各元素之间紧密联系在一起
3)有序性:各元素按顺序依次存放
注意事项:
1)数组不能被整体赋值
2)数组的数组名代表的是数组的首元素的地址
3)严禁数组的越界访问(例:定义了数组a[10],但是后续又给数组以外的部分赋值,如a[10]=1,这样就造成了越界访问)
补充:
int a[10] = {1,2,3,4,5,6,7,8,9,0};
初始化列表赋值个数不足且至少有一个时,其余值均为0;a[10]中10可省略,编译器会根据初始化列表里的数据个数自动填入
int len = sizeof(a) / sizeof(a[0]);
上式用来计算数组元素个数
由变量指定的数组在程序编写时不能被初始化
如:int n =10;
int a[n] = {1,2,3,4,5};
这样是不被允许的
2.排序
1)逆序
将一个数组逆序打印
int main(void)
{
int a[] = {1,2,3,4,5};
int i;
int len = sizeof(a) / sizeof(a[0]);
for(i = 0;i < len / 2;++i)
{
int t;
t = a[i];
a[i] = a[len - i - 1];
a[len - i - 1] = t;
}
for(i = 0;i < len;++i)
{
printf("%d\n", a[i]);
}
return 0;
}
2)选择排序
在合适的位置放上合适的数
int main(void)
{
int a[] = {4,6,2,1,7,3,8,9,5};
int i, j;
int len = sizeof(a) / sizeof(a[0]);
for(i = 0;i a[j])
{
int t;
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
for(i = 0;i < len;++i)
{
printf("%d\n", a[i]);
}
return 0;
}
3)冒泡排序
两个相邻元素两两比较,小的放前,大的放后
int main(void)
{
int a[] = {4,6,2,1,7,3,8,9,5};
int i, j;
int len = sizeof(a) / sizeof(a[0]);
for(j = len - 1;j > 0;--j)
{
for(i = 0;i a[i + 1])
{
int t = a[i];
a[i] = a[i + 1];
a[i + 1] = t;
}
}
}
for(i = 0;i < len;++i)
{
printf("%d\n", a[i]);
}
return 0;
}
4)插入排序
新建一个数组b,将a中数据依次插入
int main(void)
{
int a[] = {4,6,2,1,7,3,8,9,5};
int len = sizeof(a) / sizeof(a[0]);
int i;
int b[len];
b[0] = a[0];
for(i = 1; i 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\n", a[i]);
}
return 0;
原地插入排序
只在数组a内插入,以后说插入排序默认为原地插入排序
代码只需将上面的数组b都换成a即可