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

前言

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



一、宏定义

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

二、数据声明

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

a)一个整型数(An integer)

int a;

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

int *a;

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

int **a;

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

int a[10];

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

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

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

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

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),说明是按照函数(连续内存块)的方式来读的

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);//最终写法;先看是什么,再看指向什么(有什么),最后看读的方式(或者参数与返回)
  • C语言编译器优先级是先右后左。

三、修饰符的使用

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

  • 题目:修饰符的使用

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

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

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

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

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

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

四、位操作

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

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

五、访问固定内存位置

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不僈

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

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

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

打赏作者

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

抵扣说明:

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

余额充值