嵌入式自学第八条(4.23)
一、数组
(2)一维数组定义
1)类型名 标识符[n]。定义了元素个数为n的数组,由于未初始化,元素值随机。若要赋值需要一个一个赋值,不能整体赋值。
2)类型名 标识符[]={1,2,3,4,5},定义时对数组初始化,元素个数可以不写。
(2)一维数组引用
数组名[下标]。下标是从0开始,到n-1结束。
*void不能定义数组。
*定义数组时[]是类型说明符,引用时是方括号运算符,此时a[i]就可以看成一个表达式。
*数组在内存中存储元素具有连续性、有序性、单一性。
*去掉定义时的标识符,剩下的就是类型名。
*数组定义初始化如果花括号元素个数不足时会自动在后面补零。
*数组大小为元素个数乘元素类型大小。
*引用数组元素时要防止数组越界访问。
*数组名就是首元素地址。
*在命令模式按O就会直接开一行空行并进入编辑模式。
(3)数组相关的问题
1)数组元素遍历
在数组元素引用时不能整体访问,只能一个个访问引用。例:
输出数组所以元素:
int a[] = {1,2,3,4};
int len = sizeof(a) / sizeof(a[0]);
for(int i = 0; i < len; ++i)
{
printf("%d\n", a[i]);
}
2)数组元素逆序
例:
int a[] = {1,2,3,4};
int len = sizeof(a) / sizeof(a[0]);
for(int i = 0; i < len / 2; ++i)
{
int t = a[i];
a[i] = a[len - 1 -i];
a[len -1 - i] = t;
}
3)选择排序,以升序为例:先把第一个元素跟后面的所以元素一一对比,如果对比时第一个元素比后者大,就交换二者的值,等所有元素对比完后,第一个元素就是最小的,然后把第二个元素跟后面的元素对比,处理过程同上,这样一直处理到倒数第二个元素,就完成了升序处理,这就是选择排序。
例:
int a[] = {1,2,3,4};
int len = sizeof(a) / sizeof(a[0]);
for(int i = 0; i < len-1; ++i)
{
for(int j = i+1; j < len ,++j)
{
if(a[i] > a[j])
{
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
4)冒泡排序:以升序为例:先把第一个元素跟后面的相邻元素对比,如果大于后面的元素,就交换二者的值,再把第二个元素跟后面的对比,大于后面的元素就交换二者的值,这样处理直到倒数第二个元素,这样最大的数就放到了末尾,然后再从第一个元素处理,过程同上,这次处理到倒数第三个元素,如此反复,直到处理到只剩一个元素。
例:
int a[] = {1,2,3,4};
int len = sizeof(a) / sizeof(a[0]);
for(j = len-1; j > 0; --j)
{
for(int i = 0; i < j; ++i)
{
if(a[i] > a[i + 1])
{
int t = a[i];
a[i] = a[i + 1];
a[i + 1] = t;
}
}
}
5)插入排序:以升序为例:先把第二个元素赋给一个变量,然后变量与第一个对比,如果第二个元素小于变量,就把第一个元素的值赋给第二个,然后把变量值赋给第一个,然后把第三个元素的值赋给变量,变量与第二个元素对比,如果第二个元素大于变量,就把第二个元素的值赋给第三个元素,然后第一个元素跟变量对比,如果第一个元素大于变量,就把第一个元素的值赋给第二个元素,最后变量赋给第一个元素,当某一次比较,变量大一些,就直接把变量赋值给上一次对比的元素,如此反复进行到最后一个元素就完成了升序。
例:
int a[] = {1,2,3,4};
int len = sizeof(a) / sizeof(a[0]);
for(i = 1;i < len ;++i)
{
int t = a[i];
int j = i;
while(j > 0 && a[j - 1] > t)
{
a[j] = a[j - 1];
--j;
}
a[j] = t;
}
6)二分法查数(适合有序数列)
先把要查的数与中间的数比较,如果这个数比中间的数大,就在中间的数的右边找,然后再把这个数与右区间中间的1数比较,如此重复即可。
例:
int a[] = {1,2,3,4,5,6};
int n,begin,end,mid;
scanf("%d",&n);
begin = 0;
end = sizeof(a) / sizeof(a[0])-1;
for(mid = (begin + end) / 2;begin <= end;)
{
if(n > a[mid])
{
begin = mid;
}
else if(n < a[mid])
{
end = mid;
}
else
{
break;
}
}
if(begin <= end)
{
printf("found");
}
else
{
printf("not found");
}
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐

所有评论(0)