1.static有什么用途?(请至少说明两种)
1)函数体内,声明为static的变量,在函数调用中其值不变。
2) 在同一个文件内(但在函数体外),声明为静态的变量,可被本文件内所有函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用
2.引用( &)与指针(*)有什么区别?
1) 引用必须被初始化,指针不必。
2) 引用初始化以后不能被改变,指针可以改变所指的对象。
3) 不存在指向空值的引用,但是存在指向空值的指针。
4) 引用没有 const,指针有 const,const 的指针不可变;
附:int &ra=a; //引用ra,是变量a的引用,即别名
& 在此不是求地址运算,而是起标识作用。
声明引用,必须同时对其初始化。
引用声明完,相当于变量有两个名称。
引用本身不占有存储单元
不能建立引用的引用,指向指针的引用(int && n ; int &*p 为错误的 int *&q;正确)
3.描述实时系统的基本特性
时间约束性
可预测性
可靠性
4.全局变量和局部变量在内存中是否有区别?如果有,是什么区别?
全局变量储存在静态数据库
局部变量在堆栈。
局部变量会屏蔽全局变量
全局变量运行时会更快(不用再分配空间)
5.什么是平衡二叉树?
左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于1。
6.堆栈溢出一般是由什么原因导致的?
向堆栈中写入过多数据
7.什么函数不能声明为虚函数?
普通函数(非成员函数);
静态成员函数;
内联成员函数;
构造函数;
友元函数。
原因:只有类的成员函数才可以声明为虚函数
虚函数就是多态情况下只执行一个。继承时总是要先构造父类对象,然后子类对象,如果构造函数设为虚函数,那么当你在构造父类的构造函数时,不得不显示的调用构造,还有一个原因就是为了防错,试想如果你在子类中一不小心重写了个跟父类构造函数一样的函数,那么你的父类的构造函数将被覆盖,也即不能完成父类的构造.就会出错.
附录:声明virtual 函数返回值类型 虚函数名(形参表)
可以在基类的派生类中对虚函数重新定义
8.冒泡排序算法的时间复杂度是什么?
时间复杂度是O(n^2)。
9.写出float x 与“零值”比较的if语句。
if(x>0.000001&&x<-0.000001)
float是浮点数,不能用==,要用<和>配合一个接近0的数比较。浮点数非精确存储,只能设置一个精度
10.Internet采用哪种网络协议?该协议的主要层次结构?
Tcp/Ip协议
主要层次结构为: 应用层/传输层/网络层/数据链路层/物理层。
11.Internet物理地址和IP地址转换采用什么协议?
ARP (Address Resolution Protocol)(地址解析协议)
12.IP地址的编码分为哪两部分?
网络号和主机号。
不过是要和“子网掩码”按位与,之后才能区分哪些是网络位哪些是主机位。
13.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。
循环链表,用取余操作做
14.不能做switch()的参数类型是:
switch后面括号内,只能放int 类型或者能转化为int 类型的。
所以可以放byte char short
不可以放 float double long
实型变量(在程序运行过程中可以改变其值的实型变量称为实型变量;就是改变精度。
double,float)
15. C++程序由类和函数组成,模板也分为类模板(class template)和函数模板(function template).
函数模板与模板函数的区别是:
函数模板是模板的定义,定义中用到通用类型参数.
模板函数是实实在在的函数定义,它由编译系统在遇到具体函数调用时所生成,具有程序代码。就是把template 转化成需要的 类型。
同样,在说明了一个类模板后,可以创建类模板的实例,即生成模板类.
16.纯虚函数如何定义?使用时应注意什么?
virtual void f()=0;
是接口,子类必须要实现
17.数组和链表的区别
数组:数据顺序存储,固定大小
链表:数据可以随机存储,大小可动态改变
18. ISO的七层模型是什么?tcp/udp是属于哪一层?tcp/udp有何优缺点?
1) 应用层
表示层
会话层
运输层
网络层
数据链路层
物理层
2)tcp /udp属于运输层
3)TCP 服务提供了数据流传输、可靠性、有效流控制、全双工操作和多路复用技术等。
UDP 并不提供对 IP 协议的可靠机制、流控制以及错误恢复功能等。由于 UDP 比较简单, UDP 头包含很少的字节,比 TCP 负载消耗少。
tcp: 提供稳定的传输服务,有流量控制,缺点是包头大,冗余性不好
udp: 不提供稳定的服务,包头小,开销小
19. 已知一个数组table,用一个宏定义,求出数据的元素个数
#define NTBL
#define NTBL (sizeof(table)/sizeof(table[0]))
20. 线程与进程的区别和联系? 线程是否具有相同的堆栈? dll是否有独立的堆栈?
1)进程是死的,只是一些资源的集合,真正的程序执行都是线程来完成的,程序启动的时候操作系统就帮你创建了一个主线程。
2) 每个线程有自己的堆栈。
3) DLL中有没有独立的堆栈,这个问题不好回答,或者说这个问题本身是否有问题。因为DLL中的代码是被某些线程所执行,只有线程拥有堆栈,
如果DLL是EXE中的线程调用,DLL没有自己独立的堆栈?如果DLL是由DLL自己创建的线程所执行,DLL有独立的堆栈?
以上讲的是堆栈,如果对于堆来说,每个DLL有自己的堆,所以如果是从DLL中动态分配的内存,最好是从DLL中删除,如果你从DLL中分配内存,然后在EXE中,或者另外一个DLL中删除,很有可能导致程序崩溃
21.关键字const是什么含意?
只读
const int a;
int const a;//前两个的作用是一样,a是一个常整型数
const int *a;//指向常整型数的指针 。整型数是不可修改的,但指针可以
int * const a;//指向整型数的常指针。整型数是可以修改的,但指针是不可修改
int const * a const;//指向常整型数的常指针。整型数是不可修改的,同时指针也是不可修改
为什么还要如此看重关键字const呢?
1). 为给读代码的人传达非常有用的信息,告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的)
2). 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。
3). 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。
22. 关键字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;
}
23,语句for( ;1 ;)有什么问题?它是什么意思?
while(1)相同。
24,do……while和while……do有什么区别?
前一个循环一遍再判断,后一个判断以后再循环
25,队列和栈有什么区别?
队列先进先出;栈后进先出
队列,限定在一端插入,一端删除;栈限定在一端插入和删除
26.,对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?
c用宏定义,c++用inline(内联函数)
27.,用两个栈实现一个队列的功能?要求给出算法和思路!
设2个栈为A,B, 一开始均为空.
入队:
将新元素push入栈A;
出队:
(1)判断栈B是否为空;
(2)如果为空,则将栈A中所有元素依次pop出并push到栈B;否则直接弹出B中元素
(3)将栈B的栈顶元素pop出;
这样实现的队列入队和出队的平摊复杂度都还是O(1), 比上面的几种方法要好。
28.在c语言库函数中将一个字符转换成整型的函数是atool()吗,这个函数的原型是什么?
函数名: atol
功 能: 把字符串转换成长整型数
用 法: long atol(const char *nptr);
程序例:
#include
#include
int main(void)
{
long l;
char *str = "98765432";
l = atol(lstr);
printf("string = %s integer = %ld\n", str, l);
return(0);
}
30.局部变量能否和全局变量重名?
答:能,局部会屏蔽全局。要用全局变量,需要使用"::"
局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内
31,如何引用一个已经定义过的全局变量?
1)extern
2)引用头文件的方式
区别:用引用头文件方式来引用头文件中的全局变量,假定你将那个变量写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错
32,全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?
可以,在不同的C文件中以static形式来声明同名全局变量。
前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错
33. 直接链接两个信令点的一组链路称作什么?
PPP点到点连接
34. Heap与stack的差别。
Heap是堆,stack是栈。
Stack的空间由操作系统自动分配/释放,Heap上的空间手动分配/释放。
Stack空间有限,Heap是很大的自由存储区
C中的malloc函数分配的内存空间即在堆上,C++中对应的是new操作符。
程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上进行
35,请问C++的类和C里面的struct有什么区别?
c++中:可以有成员函数,默认为private。结构体默认为public
可以有继承,虚函数,多态
c中:只有变量
36, 请讲一讲析构函数和虚函数的用法和作用?
析构函数也是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载。知识在类对象生命期结束的时候,由系统自动调用释放在构造函数中分配的资源。这种在运行时,能依据其类型确认调用那个函数的能力称为多态性,或称迟后联编。另:析构函数一般在对象撤消前做收尾工作,比如回收内存等工作。
虚拟函数的功能是使子类可以用同名的函数对父类函数进行重载,并且在调用时自动调用子类重载函数,如果是纯虚函数,则纯粹是为了在子类重载时有个统一的命名而已。
46.请你详细的解释一下 IP 协议的定义,在哪个层上面,主要有什么作用? TCP 与 UDP 呢?
UDP , TCP 在传输层, IP 在网络层, TCP/IP 是英文 Transmission Control Protocol/Internet Protocol 的缩写,意思是 " 传输控制协议 / 网际协议 " 。 TCP/IP 协议组之所以流行,部分原因是因为它可以用在各种各样的信道和底层协议(例如 T1 和 X.25 、以太网以及 RS-232 串行接口)之上。确切地说, TCP/IP 协议是一组包括 TCP 协议和 IP 协议, UDP ( User Datagram Protocol )协议、 ICMP ( Internet Control Message Protocol )协议和其他一些协议的协议组。 TCP/IP 协议并不完全符合 OSI 的七层参考模型。传统的开放式系统互连参考模型,是一种通信协议的 7 层抽象的参考模型 , 其中每一层执行某一特定任务。该模型的目的是使各种硬件在相同的层次上相互通信。这 7 层是 : 物理层、数据链路层、网路层、传输层、话路层、表示层和应用层。而 TCP/IP 通讯协议采用了 4 层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。这 4 层分别为:
应用层 :应用程序间沟通的层,如简单电子邮件传输( SMTP )、文件传输协议( FTP )、网络远程访问协议( Telnet )等。
传输层 :在此层中,它提供了节点间的数据传送服务,如传输控制协议( TCP )、用户数据报协议( UDP )等, TCP 和 UDP 给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。
互连网络层 :负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议( IP )。
网络接口层 :对实际的网络媒体的管理,定义如何使用实际网络(如 Ethernet 、 Serial Line 等)来传送数据