1.变量的声明何定义有什么区别
变量的定义为变量分配地址和存储空间,变量的声明不分配地址。一个变量可以在多个地方声明,但是只在一个地方定义。同时加入extern修饰的变量的声明,说明此变量将在文件以外或在文件后面部分定义。
说明-很多时候一个变量,只是声明不分配内存空间,直到具体使用时才初始化,分配内存空间,如外部变量。
int main()
{
extern int A;
//这是个声明而不是定义,声明A是一个已经定义了的外部变量
//注意:声明外部变量时可以把变量类型去掉如:extern A;
dosth(); //执行函数
}
int A; //是定义,定义了A为整型的外部变量
2.简述#ifdef、#else、#endif和ifndef的作用
在程序中可以利用#ifdef、#endif将某一个模块的代码特殊定义,以向特定用户提供该功能。在不需要用户可以将其屏蔽。
#ifdef MATH
#include "math.c"
#endif
同时在window下应对硬件编译的时候,可以利用这种编译绕过硬件,直接进行编译得出预期的结果。
注意-虽然不用条件编译命令而直接用if语句也能达到要求,但那样做目标程序长,运行时间长,进行条件编译时,可以减少被编译的语句,从而减少目标程序的长度,减少运行时间。
3.写出int、bool、float、指针变量与"零值"比较的if语句
//int与零值比较
if ( n == 0 )
if ( n != 0 )
//bool与零值比较
if (flag) // 表示flag为真
if (!flag) // 表示flag为假
//float与零值比较
const float EPSINON = 0.00001;
if ((x >= - EPSINON) && (x <= EPSINON) //其中EPSINON是允许的误差(即精度)。
//指针变量与零值比较
if (p == NULL)
if (p != NULL)
4.结构体可以直接赋值吗
声明时可以直接初始化,同一结构体的不同对象之间也可以直接赋值,但是当结构体中含有指针"成员"时一定要小心。
注意-当有多个指针指向同一段内存时,某个指针释放这段内存可能会导致其他指针的非法操作。因此在释放前一定要确保其他指针不再使用这段内存空间
5.sizeof与strlen的区别
sizeof是一个操作符,strlen是库函数
sizeof的参数可以是数据的类型,也可以是变量。而strlen只能以结尾'\0'的字符串做参数
编译器在编译时就计算出了sizeof的结果,而strlen函数必须在运行时才能计算出来,并且sizeof计算的数据类型占内存的大小,而strlen计算的是字符串实际的长度
数组做sizeof的参数不退化,传递给strlen就退化为指针了
6.c语言的关键字static和C++的关键字static有什么区别
在c中,static关键字用来修饰局部静态变量和外部静态变量、函数。在C++中除了上述功能外,还用来定义类的成员变量和函数。即静态成员和静态成员函数
注意-在编程时static的记忆性,和全局性的特点可以让在不同时期调用的函数进行通信,传递信息,而C++的静态成员则可以在多个对象实例间进行通信,传递信息
7.c语言的Malloc和C++中new delete的区别
new、delete是操作符,可以进行重载,只能在C++中使用
malloc、free是函数,可以覆盖,c与C++中都可以使用
new可以调用对象的构造函数,相应delete调用的是析构函数
malloc仅仅分配内存,free仅仅回收内存,并不执行构造与析构函数
new、delete返回的是某种数据类型指针,malloc、free返回的是void指针
注意-malloc申请的内存空间要用free释放,而new申请的内存空间要用delete释放,不要混用
8.写一个"标准"宏MIN
# d e f i n e m i n ( a , b ) ( ( a ) < = ( b ) ? ( a ) : ( b ) )
9.++i和i++的区别
++i自增1再返回
i++先返回1,再自增1
10.volatile有什么作用
状态寄存器一类的并行设备硬件寄存器
一个中断服务子程序会访问到的非自动变量
多线程间被几个任务共享的变量
注意-虽然volatile在嵌入式方面应用比较多,但是在PC端软件的多线程中,volatile修饰的临界变量也是非常实用的