前言
本文主要对本专题的学习重点以习题的方式进行了总结。
一、宏定义
- 题目:用预处理指令#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个问题