嵌入式全栈开发学习笔记---C语言笔试复习大全8

目录

一维数组

数组的地址

一维数组的初始化

遍历数组

数组名的含义(笔试重点)

一维数组常见的编程题:冒泡排序

笔试题10

补充命令3:“gcc 文件名.c -o 文件名 -wall ”查看隐藏的警告

补充命令4:“&”在Linux中表示后台运行


上一篇复习了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中表示后台运行的意思。以后遇到要用的时候再详细讲。

以上就是这篇内容,如想了解更多,欢迎订阅本专栏!

如有问题可评论区或者私信留言,如果想要进交流群请私信!

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vera工程师养成记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值