目录
补充命令3:“gcc 文件名.c -o 文件名 -wall ”查看隐藏的警告
上一篇复习了8个编程题,这一片开始复习数组和函数。
说明:我们学过单片机的一般都是有C语言基础的了,网上关于C语言的资料有很多,大家如果对C语言不熟悉的话可以先去详细学一下,再以这篇博文作为复习资料学习。
这篇博文的目的是复习C语言,我们会陆续以30多个编程题作为复习要点,这30多个编程题基本涵盖了C语言所有的内容了,只要你掌握了这30多个编程题,那么你的C语言基本就没什么问题了。
注意:由于本专栏是嵌入式全栈开发专栏,为了我们能熟悉以后实际工作中的开发环境,我们写C语言全部在Linux中的vim编辑器中写,这么做事为了我们能够熟练掌握Linux系统的常用命令以及Linux上的vim编辑器的常用工作命令,以达到对口训练的目的!
vim编辑器的一些工作命令在上一篇博文中已经详细介绍过了,如果不了解可以先去看看。
我们正式开始:
数组
数组分为:
一维数组
二维数组
字符数组(笔试重点)
我们先来看一维数组
一维数组
1、一维数组的定义格式为:
类型说明符 数组名[常量表达式];
例如: int a[10]; //它表示定义了一个整形数组,数组名为a,有10个元素。
2、在定义数组时,需要指定数组中元素的个数,方括号中的常量表达式用来表示元素的个数,即数组长度。
数组的地址
注意:每个字节有一个地址,每个数组元素的地址是它的首字节的地址
记住:数组元素的地址是从低地址到高地址,也就是说a[0]存放在低地址,a[4]存放在高地址。
一定要记住这一点,今后我们在嵌入式设备里面会涉及到一个字节序的问题。
为什么要记住这一点呢?
比如我们定义一个变量int num=1;
我们来思考一个问题:
num的高字节应该放在低地址还是高地址?或者低字节应该放在低地址还是高地址?
答案是两种情况都会存在,也就是说既有高字节存放在高地址的情况,也有高字节放在低地址的情况。不同的平台(比如ARM,X86等平台)字节序可能不太一样。
一般ARM,X86等小端字节序我们常见的是低字节存放在低地址,高字节存放在高地址。
大端字节序常见的是高字节存放在低地址,低字节存放在高地址。
我们后面复习到联合体的时候,我们会讲如何判断设备的字节序。
我们的数组无疑是:数组元素的地址是从低地址到高地址,也就是说a[0]存放在低地址,a[4]存放在高地址。但是每个元素内部的地址和字节存放方式就取决于设备的字节序了。
一维数组的初始化
1、在定义数组时对数组元素赋以初值。
例如:int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
2、 可以只给一部分元素赋值。例如:
int a[10] = {0, 1, 2, 3, 4};
定义a数组有10个元素,但花括弧内只提供5个初值,这表示只给前面5个元素赋初值,后5个元素值为0。
3、如果想使一个数组中全部元素值为0,可以写成:
int a[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
或int a[10]={0};
不能写成:int a[10] = {0 * 10};
4、在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。
例如:int a[5] = {1,2,3,4,5};
也可以写成 int a[]={1,2,3,4,5};
注意:全局变量未初始化,默认是0;局部变量未初始化,默认是随机值。
补充:常量表达式中可以包括常量和符号常量,但不能包含变量。
注意:C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。
比如,我们不能这样定义数组:int k=100; int a[k]={0}; 但是我们可以这样写,先定义一个宏常量#define size 5 再将宏常量作为数组的长度int a[size];
遍历数组
用for循环
int i;
for(i=0;i<5;i++)
{
printf(“%d “,a[i]};
}
数组名的含义(笔试重点)
1、数组名a就是数组首元素地址,即0x100;
2、数组名a是地址常量,不能被修改;
3、a + 1 = 0x104;(前面说过每个字节有一个地址,每个数组元素的地址是它的首字节的地址,a+1表示首元素的地址加1,那到个第二个元素的地址,而第二个元素的地址即它首字节的地址)
4、&a表示整个数组的地址;
5、&a + 1 = 0x110;(整个数组元素的地址加1,那就是跨越了这个数组,不在这个数组的存放范围了)
6、&a[0]+1的含义和a+1的含义是一样的。
强调:
%p就用来打印地址,带0x
&在C语言中表示取地址,如&a[0]表示取地址a[0]
一维数组常见的编程题:冒泡排序
冒泡排序规则:从左到右,相邻的两个数比较大小,如果要求从小到大排序,那么比较后,如果前一个数比后一个数大,那么就将这两个数的位置调换,如此反复,直到所有数的大小满足从小到大顺序排序。
笔试题10
问:从键盘中输入乱序的10个数字,用冒泡排序将这个10个数字按从小到大排序
提示:比如说用冒泡排序将5 6 4 7 3 8 按从小到大排序
剩下的3无疑是最小的了,就不需要继续比较了,因此我们需要两层循环,一个是趟数循环(一共是5趟),一个是每趟里面的次数循环(一共是5次)。
但是,我们为了保证程序的效率,当我们挑出来最大的几个数后,下一趟循环我们就没必要再进行比较后面的了。
因此我们每一趟循环中的次数都比上一趟循环的次数要少一次。
解题:
参考代码:
#include <stdio.h>
int main()
{
int a[10]={0};
int i,j,num;
//获取数组元素
for(num=0;num<sizeof(a)/sizeof(a[0]);num++)
{
scanf("%d",&a[num]);
}
//冒泡排序
for(i=0;i<sizeof(a)/sizeof(a[0])-1;i++)
{
for(j=0;j<sizeof(a)/sizeof(a[0])-1-i;j++)
{
if(a[j]>a[j+1])
{
int tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
//遍历数组
for(num=0;num<sizeof(a)/sizeof(a[0]);num++)
{
printf("%d ",a[num]);
}
return 0;
}
运行结果:
请务必要把冒泡排序搞懂并且把这段代码牢记!
补充命令3:“gcc 文件名.c -o 文件名 -wall ”查看隐藏的警告
把所有的警告打开,有时候我们写错了程序但是也能正常编译,并且没有显示有警告,但是程序我们明明知道是错误的,我们可以使用这条命令查看隐藏的警告。
补充命令4:“&”在Linux中表示后台运行
在Linux中表示后台运行的意思。以后遇到要用的时候再详细讲。
以上就是这篇内容,如想了解更多,欢迎订阅本专栏!
如有问题可评论区或者私信留言,如果想要进交流群请私信!