• 【嵌入式C语言】9.专题习题总结


    前言

    本文主要对本专题的学习重点以习题的方式进行了总结。



    一、宏定义

    • 题目:用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)。
    #define 宏名(大写)  宏体
    #define SECOND_OF_YEAR  365*24*3600)UL//常量表达式编译的时候已经计算过了;
    //()用于保护,防止优先级导致的错误;默认是int,UL是无符号long类型
    
    • 1
    • 2
    • 3

    二、数据声明

    • 题目:用变里a给出下面的定义。

    a)一个整型数(An integer)

    int a;
    
    • 1

    b)一个指向整型数的指针( A pointer to an integer)

    int *a;
    
    • 1

    c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer toan integer)

    int **a;
    
    • 1

    d)一个有10个整型数的数组(An array of 10 integers)

    int a[10];
    
    • 1

    e)一个有10个指针的数组,该指针是指向一个整型数的。(An array of 10 pointers tointegers )

    int *a[10];//int是修饰*的,读取大小;*是修饰10的,修饰10个的每一个;[]才是修饰a的,a是数组
    
    • 1

    f)一个指向有10个整型数数组的指针(A pointer to an array of 10 integers)

    int [10] *a;//分析过程
    //---->
    int (*a)[10];//最终写法,(*a)右面是[10],说明是按照数组(10个整体,连续内存块)的方式来读的
    
    • 1
    • 2
    • 3

    g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数( A pointer to afunction that takes an integer as an argument and returns an integer)

    int fun(int x) *a;//分析过程
    //---->
    int*a) (int x);//最终写法,(*a)右面是(int x),说明是按照函数(连续内存块)的方式来读的
    
    • 1
    • 2
    • 3

    h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数(An array of ten pointers to functions that take an integer argument and return aninteger )

    int fun(int x)[10] *a;//分析过程
    //---->
    int (*a[10]) (int x);//最终写法;先看是什么,再看指向什么(有什么),最后看读的方式(或者参数与返回)
    
    • 1
    • 2
    • 3
    • C语言编译器优先级是先右后左。

    三、修饰符的使用

    类型修饰符:对内存资源存放位置的限定,资源属性中位置的限定。

    • 题目:修饰符的使用

    a)关键字static的作用是什么?

    //1修饰局部变量
    //默认局部变量在栈空间存在,生存周期比较短。
    //局部静态化后,局部变量在静态数据段保存,生存周期非常长。
    //===================================================
    //2.修饰全局变量
    //编译时防止重命名,只在本文件中起作用。
    //===================================================
    //3.修饰(全局)函数
    //编译时防止重命名,只在本文件中起作用。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    b)关键字const有什么含意?

    //在C语言中,是建议性的只读,不具备强制性,!=常量。
    //使用指针、越界、溢出的方式是可以修改的。
    //==================================================
    //在C++中是常量
    
    • 1
    • 2
    • 3
    • 4

    c)关键字volatile有什么含意?并给出三个不同的例子。

    //防止C语言编译器的优化,它修饰的变量可能通过第三方来修改,比如硬件、中断及多线程。
    
    • 1

    四、位操作

    嵌入式系统总是要用户对变里或寄存器进行位操作。

    • 问题:给定一个整型变里a,写两段代码,第一个设置a的bit 3,第二个清除a的bit 3。在以上两个操作中,要保持其它位不变。
    a|=(0x1<<3);//bit3代表第四位,或
    //=============
    a&=~(0x1<<a);//与
    
    • 1
    • 2
    • 3

    五、访问固定内存位置

    • 问题:在某工程中,要求设置一绝对地址为0x67a9的整型变里的值为Oxaa66·编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。
    int *p=(int *)0x67a9;//强制转换为地址属性
    p[0]=0xaa66;
    //or
    *((int *)0x67a9)=0xaa66;
    //问题变化:把这个地址当成函数来处理,分析如下:
    (*)0x67a9;//(*)强转为地址
    void(*)(void)0x67a9;//函数带输入参数和返回值,整体是一个地址
    (void(*)(void)0x67a9();//后加()调用
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    参考资料:
    链接1: 嵌入式C语言
    链接2: 嵌入式工程师C语言面试常见的0x10个问题

  • 相关阅读:
    人工智能的兴起和发展
    联想服务器-HTTP boot安装Linux系统
    js中this的指向问题
    第四章分类问题
    雷神MixBook Air笔记本系统故障怎么重装?
    契约锁乔迁新址,欢迎新老朋友来坐坐
    Unity中Shader的PBR的基础知识与理论
    从Spring为什么要用IoC的支点,我撬动了整个Spring的源码脉络
    11.如何修改默认的负载均衡算法(springcloud)
    Linux下用rm误删除文件的三种恢复方法
  • 原文地址:https://blog.csdn.net/weixin_43490708/article/details/126734177