-

WORD
格式
可编辑
(一)
1
什么是预编译,何时需要预编译:
答案:
1、总是使用不经常改动的大型代码体。
2、
程序由多个模块组成,
所有模块都使用一组标准的包含文件和相同的编译选项。
在这种
情况下,可以将所有包含文件预编译为一个预编译头。
2 char * const
p
char const * p
const char *p
上述三个有什么区别?
答案:
char * const p; //
常量指针,
p
的值不可以修改
char const * p
;
//
指向常量的指针,指向的常量值不可以改
const char *p
;
//
和
char const *p
3
char str1[] =
char str2[] =
const char str3[] =
const char str4[] =
const char *str5 =
const char *str6 =
char *str7 =
char *str8 =
cout < < ( str1 == str2 ) < < endl;
cout < < ( str3 == str4 ) <
< endl;
cout < < ( str5 ==
str6 ) < < endl;
out < < (
str7 == str8 ) < < endl;
结果是:
0 0 1 1
str1,str2,str3,str4
是数组变量,它们有各自的内
存空间;而
str5,str6,str7,str8
是指针,
它们指
向相同的常量区域。
4
以下代码中的两个
sizeof
用法有问题吗?
[C
易
]
void UpperCase( char str[]
)
//
将
str
中的小写字母转换成大写字母
{
for( size_t i=0; i
if( 'a' <=str[i] && str[i] <='z' )
str[i] -= ('a'-'A' );
}
char str[] =
cout < <
字符长度为
:
UpperCase( str );
cout < < str < < endl;
答案:
函数内的
sizeof
有问题。根据语法,
sizeof
如用于数组,只能测出静态数组的大小,
无法检测动态分配的或外部数组大
小。函数外的
str
是一个静态定义的数组,因此其大小为
6
,因为还有
'0'
,函数内的
str
实际只是一个指向字符串的指针,没有任何
额外的与数组相
专业知识整理分享
WORD
格式
可编辑
关的信息,因此
sizeof
作用于上只将其当指针看,一个指针为
4
个字
节,因此返回
4
。
5
一个<
/p>
32
位的机器
,
该机器的指针是多少位
答案:
指针是多少位只要看地址总线的位数就行了
< br>。
80386
以后的机子都是
3
2
的数据总线。所以
指针的位数就是
4
个字节了。
6 main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf(
}
答案:
2
5
分析:
*(a+1
)就是
a[1]
,
*(ptr-1)
就是
a[4],
执行结果是
2
,
5
。
&a+1
不是首地址
+1
,系统会
认为加一个
a
数组的偏移,
是偏移了一个数组的大小
(本例是
5
个
int
)
int *ptr=(int *)(&a+1);
则
ptr
实际是
&(
a[5]),
也就是
a+5
原因如下:
&a
是数组指针,其类型为
int
(*)[5];
而指针
加
1
要根据指针类型加上一定的值,不同类
型的指针
+1
之后增加的大小不同
<
/p>
a
是长度为
5
的
int
数组指针,所以要加
5*sizeof(int)
所以
p
tr
实际是
a[5]
但是
prt
与
(&a+1)
类
型是不一
样的
(
这点很重要
)
所以
prt-1
只会
减去
sizeof(int*)
。
<
/p>
a,&a
的地址是一样的,但意思不一样,
a
是数组首地址,也就是
a[0]
的
地址,
&a
是对象(数组)首地址,
a
+1
是数组下一元素的地
址,即
a[1
],&a+1
是下一个对象的地址,即
a[5].
7
请问以下代码有什么问题:
int
main()
{
char a;
char *str=&a;
strcpy(str,
printf(str);
return 0;
}
答案:没有为
str
分配内存空间,将会发
生异常,问题出在将一个字符串复制进一个字符变
量指针所指地址。
虽然可以正确输出结果,但因为越界进行内存读写而导致程序崩溃
。
8
Char
*
s=
printf(
s[0]='B';
printf(
有什么错?
答案:
是字符串常量。
s
是指针,
指向这个字符串常量,所以声明
s
的时候就有问题。
cosnt
char* s=
然后又因为是常量,所以对是
s[0]
的赋值操作是不合法的。
9
写一个
“
标准
”
宏,这个宏输入两个参数并返回
较小的一个。
答案:
.#define Min(X, Y)
((X)>(Y)?(Y):(X))
//
结尾没有
‘
;
’
专业知识整理分享
WORD
格式
可编辑
10
嵌
入式系统中经常要用到无限循环,你怎么用
C
编写死循环?
答案:
while(1){}
或者
for(;;)
11
关键字
static
的作用是什么?
答案:定义静态变量
或
静态函数
12
关键字
const
有什么含意?
答案:表示常量不可以修改的变量。
13
关键字
volatile
有什么含意?并举出三个不同的例子?
<
/p>
答案:提示编译器对象的值可能在编译器未监测到的情况下改变。
(
1
)并行设备的硬件寄存器(如状态寄存器)
(
2
)中断函数中会访问到的非自动变量
(
3
)多线
程应用中被几个任务共享的变量
14
int
(*s[10])(int)
表示的是什么啊?
答案:
int (*s[10])(int)
函数指针数组,每个指针指向一个
int func(int
param)
的函数。
15
有以下表达式:
int
a=248
,
b=4;
int const c=21;
const int *d=&a;
int
*const e=&b;
int const *f const =&a;
请问下列表达式哪些会被编译器禁止?为什么?
答案:
*c=32;
d=&b;
*d=43;
e=34;
e=&a;
f=0x321f;
*c
这是个什么东东,
禁止
*d
说
了是
const
,
禁止
e = &a
说了是
const
禁止
const *f const
=&a;
禁止
16
交换两个变量的值,不使用第
三个变量。即
a=3,b=5,
交换之后
a=5,b=3;
答案:有两种解法
,
一种用算术算法
,
一种用
^(
异或
)
。
a = a + b; b = a - b; a = a
- b;
或者
a = a^b;//
只能对
int,char.. b = a^b; a =
a^b; or a ^= b ^= a;
17 c
和
c++
中的
struct
有什么不同?
答案:
c
和
c
++
中
struct
的主要区别是
c
中的
struct
不可以含有成员函数,而
c++
中的
struct
可以。
c++
中
struct
和
class
的主要区别在于默认的存取权限不同,
struct
默认为
public
,而
class
默认为
private
18.
#include
#include
void getmemory(char *p)
{
p=(char *) malloc(100);
专业知识整理分享
WORD
格式
可编辑
strcpy(p,
}
int main( )
{
char
*str=NULL;
getmemory(str);
printf(
free(str);
return 0;
}
答案:程序崩溃,
getmemory
中的
malloc
不能返回动态内存,
free
()对
str
操作很危险
19
char
szstr[10];
strcpy(szstr,
产生什么结果?为什么?
答案:
长度不一样,会造成非法的
OS
20
列举几种进程的同步机制,并比较其优缺点
答案:
原子操作
信号量机制
自旋锁
管程,会合,分布式系统
21.
进程之间通信的途径
答案:共享存储系统消息传递系统管道:以文件系统为基础
22.
进程死锁的原因
答案:资源竞争及进程推进顺序非法
23.
死锁的
4
个必要条件
答案:互斥、请求保持、不可剥夺、环路
24.
死锁的处理
答案:鸵鸟策略、预防策略、避免策略、检测与解除死锁
25.
操作系统中进程调度策略有哪几种?
答案:
FCFS(
先来先服务
)
,优先级,时间片轮转,多级反馈
26.
类的静态成员和非静态成员有
何区别?
答案:类的静态成员每个类只有一个,非静态成员每个对象一个
27.
纯
虚函数如何定义?使用时应注意什么?
答案:
virtual void f()=0;
是接口,子类必须要实现
28.
数组和链表的区别
答案:数组:数据顺序存储,固定大小连表:数据可以随机存储,大小可动态改变
< br>
专业知识整理分享
WORD
格式
可编辑
的七层模型是什么?
tcp/udp
是属于哪一层?
tcp/udp
有何优缺点?
答案:应用层
表示层
会话层
传输层
网络层
链路层
物理层
;
tcp
/udp
属于传输层
;
TCP
服务提供了数据流传输、
可靠性、
有效
流控制、
全双工操作和多路复用技术等。
与
TCP
不同,
UDP
并不提供对
IP
协议的可靠机制、流控制以及错误恢复功能等。由于
UDP
比
较简单,
UDP
头包含很少的字节,比
TCP
负载消耗少。
tcp:
提供稳定的传输服务,有
流
量控制,缺点是包头大,冗余性不好
udp:
不提供稳定的服务,包头小,开销小
30
:
(void *)ptr
和
(*(void**))ptr<
/p>
的结果是否相同?其中
ptr
为同一个指
针
答案:
.(void *)ptr
和
(*(void**))ptr<
/p>
值是相同的
31
:
int main()
{
int x=3;
printf(
return 1;
}
问函数既然不会被其它函数调用,为什么要返回
1
?
答案:
mian
中,
c
标准认为<
/p>
0
表示成功,非
0
表示错误。具体的值是某中具体出错信息
32
要对绝对地址
0x100000
赋值,
我们可以用
< br>
(unsigned int*)0x100000 = 1234;
那么要是想
让程序跳转到绝对地址是
0x10
0000
去执行,应该怎么做?
答案:
*((void
(*)(
))0x100000
)
(
);
首先要将
0x100000
强制转换成函数指针
,
即
< br>:
(void
(*)())0x100000
然后再调用它
:
*((void
(*)())0x100000)();
用
< br>typedef
可以看得更直观些
:
typedef
void(*)()
voidFuncPtr;
*((voidFuncPtr)0x100000)();
33
,已知一个数组
table
,用一个宏定义,求出数据的元素个数
答案
:
#define NTBL(table)
(sizeof(table)/sizeof(table[0]))
34
。线程与进程的区别和联系
?
线程是否具有相同的堆栈
?
dll
是否有独立的堆栈
?
答案:
进程是死的,
只是一些资源的集合,真正的程序执行都是线程来完成的,程序启动的
时候操作
系统就帮你创建了一个主线程。每个线程有自己的堆栈。
DL
L
中有没有独立的堆
栈,这个问题不好回答,或者说这个问题本
身是否有问题。因为
DLL
中的代码是被某些线
程所执行,
只有线程拥有堆栈,
如果
< br>DLL
中的代码是
EXE
中的线
程所调用,
那么这个时候
是不是说这个
DLL
没有自己独立的堆栈?如果
DLL
中的代码是由
DLL
自己创建的线程所
执行,
那么是不是说
DLL
有独立的
堆栈?以上讲的是堆栈,如果对于堆来说,每个
DLL
有
自己的堆,所以如果是从
DLL
中动态分配的
内存,最好是从
DLL
中删除,如果你从
DLL
中分配内存,然后在
EXE
中
,或者另外一个
DLL
中删除,很有可能导致程序崩溃
35
。
专业知识整理分享
WORD
格式
可编辑
unsigned short A = 10;
printf(
char c=128;
printf(
输出多少?并分析过程
答案:第一题,~
A
=
0xfffffff5,int
值
为-
11
,但输出的是
uin
t
。所以输出
4294967285
第
二题,
c
=
0x10,
输出的是
int
,最高位为
1
,是负数,所以它的值就是
0x00
的补码就是
128
,
< br>所以输出-
128
。这两道题都是在考察二进制向
int
或
uint
转
换时的最高位处理。
(二)
1. -1,2,7,28,,126
请问
28
和
126
中间那个数是什么?
为什么?
答案:第一题的答案应该是
4^3-1=63
规律是
n^3-1(
当
n
为偶数
0
,
2
,
4)
n^3+1(
当
n
为
奇数
1
,
3
,
5)
2.
用两个栈实现一个队列的功能?要求给出算法和思路!
答案:设
2
个栈为
A,B,
一开始均为空
.
入队
:
将新元素
push
入栈
A;
出队
:
(1)
判断栈
B
是
否为空;
(2)
如果不为空,
则将栈
A
中所有元素依次
pop
出并
push
到栈
B
;
(3)
将栈
B
的栈
顶元素
po
p
出;
这样实现的队列入队和出队的平摊复杂度都还是
O(1),
比上面的几种方法要
好。
3.
在<
/p>
c
语言库函数中将一个字符转换成整型的函数是
< br>atol()
吗,这个函数的原型是什么?
答案:
函数名
: atol
功
能
:
把字符串转换成长整型数
用
法
:
long atol(const char *nptr);
程序
例
:
#include
#include
int main(void)
{
long l;
char *str =
l = atol(lstr);
printf(
return(0);
}
4
。对于
一个频繁使用的短小函数
,
在
C
语言中应用什么实现
,
在
C++
中应用什么实现
?
答案:
c
用
宏定义,
c++
用
inline
5
。直接
链接两个信令点的一组链路称作什么
?
答案:
PPP
点到点连接
7
< br>。软件测试都有那些种类
?
答案:黑盒:针对系统功能的测试
白合:测试函数功能,各函数接口
8
。确定模块的功能和模块的接口是
在软件设计的那个队段完成的
?
专业知识整理分享
WORD
格式
可编辑
答案:概要设计阶段
9
。
enum string
{
x1,
x2,
x3=10,
x4,
x5,
}x;
问
x
;
答案:取值在
0
。
1
。
10
。
1
1
。
12
中的一个
10
。
unsigned char *p1;
unsigned long *p2;
p1=(unsigned char *)0x801000;
p2=(unsigned long
*)0x810000;
请问
p1+5=
;
p2+5=
;
答案:
801005
;
810014
。不要忘记了这个是
16
进制的数字,
p2
要加
20
变为
16
进制就是
14
选择题
:
net
链接到
Internet
用到
以下那个协议
?
A. HDLC;
B. ARP
;
C. UDP;
D. TCP;
E. ID
答案
D
2.
属于网络层协议的是
:
;
;
;
D.X.25
答案
B
s
消息调度机制是
:
A.
指令队列
;B.
指令堆栈
;C.
消息队列
;D.
消息堆栈
;
答案:
C
找错题
:
1.
请问下面程序有什么错误
?
int a[60][250][1000],i,j,k;
for(k=0;k <=1000;k++)
for(j=0;j <250;j++)
for(i=0;i <60;i++)
a[i][j][k]=0;
答案:把循环语句内外换一下
2
。以下是求一个数的平方的程序<
/p>
,
请找出错误
:
#define SQUARE(a)
((a)*(a))
int a=5;
int b;
专业知识整理分享
WORD
格式
可编辑
b=SQUARE(a++);
答案:这个没有问题,
s
(
a
++)
,就是(
(
a
++)
×
(
a
++)
)唯一要注意的就是计算后
a
=
7
了
3:
typedef unsigned char BYTE
int
examply_fun(BYTE gt_len; BYTE *gt_code)
{
BYTE
*gt_buf;
gt_buf=(BYTE
)MALLOC(Max_GT_Length);
......
if(gt_len>Max_GT_Length)
{
return GT_Length_ERROR;
}
.......
}
答案:要释放内存问答题
:
Phone
的原理是什么
?
答案:
IPV6
/IP
通
信建立的过程怎样,端口有什么作用?
答案:三次握手,确定是哪个应用程序使用该协议
(三)
1
、局部变量能否和全局变量重名?
答案:能,局部会屏蔽全局。要用全局变量,需要使用
局部变量可以与全局变量同名,
在函数内引用这个变量时,
会用到同名的局部变量,
而不会用到全局变量。
对于
有些编译器
而言,
在同一个函数内可以定义多个同名的局部变量
,
比如在两个循环体内都定义一个同名
的局部变量,而那个局部
变量的作用域就在那个循环体内
2
、如何引用一个已经定义过的全局变量?
答案:
extern
可以用引
用头文件的方式,
也可以用
extern
关键字,
如果用引用头文件方式来
引用某个在头文件中声明的
全局变理,
假定你将那个变写错了,
那么在编译期间会报错,<
/p>
如
果你用
extern
< br>方式引用时,
假定你犯了同样的错误,
那么在编译期间不
会报错,
而在连接期
间报错
3
、全局
变量可不可以定义在可被多个
.C
文件包含的头文件中?为什么
?
答案:
可以,
在不同的
C
文件中以
static
形式来声明同名全局变量。
可以在不同的
C
文件中
声明同名的全局变量,前提是其中只能有一个
C
文件中对此变量赋初值,此时连接不会出
错
专业知识整理分享
WORD
格式
可编辑
4
、语句
for(
;
1
;
)<
/p>
有什么问题?它是什么意思?
答案:和
while(1)
相同。
5
、
do……while
和
while……do
有什么区别?
答案:前一个循环一遍再判断,后一个判断以后再循环。
6
、请写出下列代码的输出内容
#
include
main()
{
int a,b,c,d;
a=10;
b=a++;
c=++a;
d=10*a++;
printf(
,
< br>c
,
d
:
%d
,
%d
,
%d
,
b
,
c
,
d
)
;
return 0;
}
答案:
10
,
12
,
120
a=10;
b=a++;//a=11 b=10
c=++a;//a=12 c=12
d=10*a++;//a=13 d=120
高级题
1
、
sta
tic
全局变量与普通的全局变量有什么区别?
static<
/p>
局部变量和普通局部变量有什么区
别?
s
tatic
函数与普通函数有什么区别?
答案:全局变量
(
外部变量
)
的说明之前再冠以
static
就构成了
静态的全局变量。全局变量本
身就是静态存储方式,静态全局变量当然也是静态存储方式
。
这两者在存储方式上并无不
同。这
两者的区别虽在于非静态全局变量的作用域是整个源程序,
当
一个源程序由多个源
文件组成时,
非静态的全局变量在各个源文
件中都是有效的。
而静态全局变量则限制了其作
用域,
即只在定义该变量的源文件内有效,
在同一源程序的其它源文件中不能使用它。
由
于静态全局变量的作用域局限于一个源文件内,
只能为该源文件内的函数公用,
因此可以避
免在其它源文件中引起错误。从以上分析可以看出,
把局部变量改变为静态变量后是改变
了它的存
储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,
限制了
它的使用范围。
static
函数与
普通函数作用域不同。仅在本文件。只在当前源文件中
使用的函数应该说明为内部函数<
/p>
(static)
,内部函数应该在当前源文件中说明和定义。<
/p>
对于可
在当前源文件以外使用的函数,
应
该在一个头文件中说明,
要使用这些函数的源文件要包含
这个头
文件
static
全局变量与普通的
全局变量有什么区别:
static
全局变量只初使化一次,<
/p>
防止在其他文件单元中被引用
;
sta
tic
局部变量和普通局部变量有什么区别:
static
局部变量
只被初始化一次,下一次依据上一次结果值;
static
函数与普通函数有什么区别:
static
函
数在内存中只有一份,普通函
数在每个被调用中维持一份拷贝
2
、程序的局部变量存在于()中,全局变量存在于()中,动
态申请数据存在于(
)中。
答案:栈;静态区;堆
专业知识整理分享
WORD
格式
可编辑
3
、设有以下说明和定义:
typedef union
{
long i;
int k[5];
char
c;
} DATE;
struct data
{
int cat;
DATE cow;
double dog;
} too;
DATE max;
则语句
printf(
的执行结果是:
_20_
答案:
< br>DATE
是一个
union,
变量公用空间
.
里面最大的变量类型是
int[5],
占用
20
个字节
.
所
以它的大小是
20
data
是一个
struct,
每个变量分开占用空间
.
依次为
int4
+
DA
TE20
+
double8 = 32.
所以结果是
20 + 32 =
52.
当然
...
在某些
16
位编辑器下
, int
可能是
2
字节
,
那么
结果是
int2 +
DATE10 + double8 = 20
4
、队列和栈有什么区别?
答案:队列先进先出,栈后进先出
6
、已知一个单向链表的头,请写出删除其某一个结点的算法,
要求,先找到此结点,然后
删除。
答案:
slnodetype
*Delete(slnodetype *Head,int key)
{
if(Head->number==key)
{
Head=Pointer->next;
free(Pointer);
break;
}
Back = Pointer;
Pointer=Pointer->next;
if(Pointer->number==key)
{
Back->next=Pointer->next;
free(Pointer);
break;
}
专业知识整理分享
-
-
-
-
-
-
-
-
-
上一篇:C++文件的输入输出
下一篇:PEP三年级下册英语第一单元教案