1.预编译的作用:预处理,在程序执行前做的一些指令,包含头文件,宏定义,条件编译
2.写一个宏,输入两个参数返回最小的那个:
#dene MIN(x,y) ((x)<(y):(x)?(y))
3.#与##的作用:#将宏参数转化为字符串,##连接两个宏参数
4.Stac:修饰存储类型使之成为静态存储类型:函数结束后变量的值不会销毁,修饰链接
属性使之成为内部链接属性,只初始化一次
(1)限制变量的作用域(全局变量)(2)设置变量的存储域(局部变量)C+
+:修饰成员变量或函数
5.Const:声明常变量,使变量的值不能被改变,修饰函数形参,使得形参在函数内不能被
修改,修饰函数返回值
6.Volite:被定义为 volite 的变量可能会被意想不到的改变(编译器的未知因素:操作系统 、
硬件或其他线程),编译器就不会去假设变量的值,
不使用保存在寄存器中的备份,而是读取原始内存地址,不对该变量所参与的
操作进行优化
并行设备的硬件寄存器。存储器映射的硬件寄存器通常加 volale
一个中断服务程序中修改的供其他程序检测的变量
多线程应用中被几个任务共享的变量
(1)一个变量可以既是 const 还是 volale 吗?解释为什么?
可以,例如状态寄存器。它首先应该是 volale 因为它可以出乎意料的修改,而
且应该是 const,这个寄存器程序不应该去修改。
7.堆与栈:堆:程序员手动分配内存,释放;栈:编译器自动分配内存
8.内存分配方式:从静态存储区分配,堆上申请,栈上分配
9.函数指针和指针函数:指针函数:返回值是一个指针(地址值)函数指针:本质是一个
指针变量,是指向函数的指针
10.dene 和 typedef:dene:不检查语法,简单的字符串替换 typedef:关键字,在预编译
的时候处理
11.局部变量和全局变量能否重名:可以
12.引用一个已经定义过的全局变量:extern
13.内存的越界、泄漏、溢出:
溢出:程序在申请内存时,没有足够的内存空间供其使用;
泄漏:程序在申请动态分配的堆内存内存后,无法释放已申请的内存空间,造成系统
内存的浪费,导致程序运行速度减慢甚至系统崩溃
越界:系统申请内存后使用时超出申请范围
14.未用 free 释放内存会产生后果
15.回调函数
16.用预处理指令#dene 声明一个常数,用以表明 1 年中有多少秒(忽略闰年问题)
#dene SECONDS_PER_YEAR (365*24*60*60)UL
17.已知一个数组 tabe,用一个宏定义,求出数据的元素个数
#dene SIZE (sizeof(table)/sizeof(table[0])
18.如何在两个 c 文件中访问对方的静态变量和全局变量:
静态变量:在原文件中添加读写变量的外部函数:stac int a; extern int get_a(){return a
} 通过函数调用访问
全局变量:建立一个头文件,在头文件中声明变量:extern <type> <var_name> 在外部
链接该变量
评论0