文章目录
-
- 关键字static的作用是什么?
- 关键字const是什么含意?
- 关键字volatile有什么含意 并给出三个不同的例子。
- “引用”与指针的区别是什么?
- .h头文件中的ifndef/define/endif 的作用?
- 描述实时系统的基本特性
- 全局变量和局部变量在内存中是否有区别?如果有,是什么区别?
- 全局变量和静态全局变量的区别
- 数组与链表的区别
- 什么是平衡二叉树?
- 堆栈溢出一般是由什么原因导致的?
- 冒泡排序算法的时间复杂度是什么?
- 什么函数不能声明为虚函数?
- 队列和栈有什么区别?
- 不能做switch()的参数类型
- 局部变量能否和全局变量重名?
- 如何引用一个已经定义过的全局变量?
- 全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?
- 语句for( ;1 ;)是什么意思?
- do……while和while……do有什么区别?
- static 全局变量、局部变量、函数与普通全局变量、局部变量、函数
- 程序的内存分配
- 进程与线程的区别
- 解释堆和栈的区别
- 什么是预编译,何时需要预编译
- 三种基本的数据模型
- 结构与联合有和区别?
- 描述内存分配方式以及它们的区别?
- 请说出const与#define 相比,有何优点?
- 简述数组与指针的区别?
- 分别写出BOOL,int,float,指针类型的变量a 与“零”的比较语句。
- 如何判断一段程序是由C 编译程序还是由C++编译程序编译的?
- 论述含参数的宏与函数的优缺点
- 用两个栈实现一个队列的功能?要求给出算法和思路! 答 、设2个栈为A,B, 一开始均为空.
- 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?
- 位操作(Bit manipulation)
- 访问固定的内存位置(Accessing fixed memory locations)
- 中断(Interrupts)
- 动态内存分配(Dynamic memory allocation)
- Typedef
- 用变量a给出下面的定义
- 解释局部变量、全局变量和静态变量的含义。
- 写一个“标准”宏
- A.c 和B.c两个c文件中使用了两个相同名字的static变量,编译的时候会不会有问题?这两个static变量会保存到哪里(栈还是堆或者其他的)?
- 一个单向链表,不知道头节点,一个指针指向其中的一个节点,问如何删除这个指针指向的节点?
- C语言中各进制表示法
- 中断与异常的区别
关键字static的作用是什么?
1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
关键字const是什么含意?
答:我只要一听到被面试者说:“const意味着常数”,我就知道我正在和一个业余者打交道。去年Dan Saks已经在他的文章里完全概括了const的所有用法,因此ESP(译者:Embedded Systems Programming)的每一位读者应该非常熟悉const能做什么和不能做什么.如果你从没有读到那篇文章,只要能说出const意味着“只读”就可以了。尽管这个答案不是完全的答案,但我接受它作为一个正确的答案。(如果你想知道更详细的答案,仔细读一下Saks的文章吧。)如果应试者能正确回答这个问题,我将问他一个附加的问题:下面的声明都是什么意思?
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。如果应试者能正确回答这些问题,那么他就给我留下了一个好印象。顺带提一句,也许你可能会问,即使不用关键字 const,也还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键字const呢?我也如下的几下理由:
1). 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。)
2). 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。
3). 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现
关键字volatile有什么含意 并给出三个不同的例子。
答:一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3). 多线程应用中被几个任务共享的变量
回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。
假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。
1). 一个参数既可以是const还可以是volatile吗?解释为什么。
2). 一个指针可以是volatile 吗?解释为什么。
3). 下面的函数有什么错误:
int square(volatile int *ptr)
{
return *ptr * *ptr;
}
下面是答案:
1). 是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
2). 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。
3). 这段代码的有个恶作剧。这段代码的目的是用来返指针ptr指向值的平方,但是,由于ptr指向一个volatile型参数,编译器将产生类似下面的代码:
int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}
由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}
“引用”与指针的区别是什么?
-
引用必须被初始化,指针不必。
-
引用初始化以后不能被改变,指针可以改变所指的对象。
-
不存在指向空值的引用,但是存在指向空值的指针。
指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。
流操作符<<和>>、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用
.h头文件中的ifndef/define/endif 的作用?
答:防止该头文件被重复引用。
描述实时系统的基本特性
答 :在特定时间内完成特定的任务,实时性与可靠性。
全局变量和局部变量在内存中是否有区别?如果有,是什么区别?
答 :全局变量储存在静态数据区,局部变量在堆栈中。
全局变量的生命周期是整个函数区间,局部变量的生命周期是声明该变量的函数区间
全局变量和静态全局变量的区别
1、全局变量和静态全局变量都存储在静态数据区
2、全局变量的作用域是整个函数,静态全局变量的作用域是声明该变量的模块
数组与链表的区别
数组是一块连续的内存区间、大小固定,数据只能连续存储
链表可以是一块连续的内存区间也可以是不连续的内存区间,大小不固定,数据可以随机存储
什么是平衡二叉树?
答 :左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于1。
堆栈溢出一般是由什么原因导致的?
答 :1.没有回收垃圾资源 ;2.层次太深的递归调用
冒泡排序算法的时间复杂度是什么?
答 :O(n^2)
什么函数不能声明为虚函数?
答:constructor构造函数
队列和栈有什么区别?
答:队列先进先出,栈后进先出
不能做switch()的参数类型
答 :C/C++中支持byte,char,short,int,long,bool,整数类型和enum(枚举)类型。
不支持float,double,string
局部变量能否和全局变量重名?
答:能,局部会屏蔽全局。要用全局变量,需要使用"::"
局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内
如何引用一个已经定义过的全局变量?
答 :可以用引用头文件的方式,也可以用extern关