C语⾔常见⾯试题
⾯试题>>C 语⾔
1.请写出 : bool, float, *p 与零值⽐较的 if 语句
bool flag : if(flag) if(!flag)
float x : const float EXP = 0.0000001 ;if((x >= -EXP) && (x <= EXP))
int *p : if(p == NULL) if(p != NULL)
2. win32 和 linux 下 : sizeof() 的计算
见课本;
3.⽤变量 a 给出下⾯的定义
a.⼀个有10个指针的数组,该指针是指向⼀个整型数的;
b.⼀个指向有10个整型数数组的指针;
c.⼀个指向函数的指针,该函数有⼀个整型参数并返回⼀个整型数;
d.⼀个有10个指针的数组,该指针指向⼀个函数,该函数有⼀个整型参数并返回⼀个整型数;
int * a[10];
int (*a)[10]
int (*a)(int);
int (*a[10])(int);
4.结构体.联合.位段.内存⼤⼩的计算
struct A
{
int a;
char b;
float c;
struct A d;
double e;
}; sizeof(A)
5.代码改错
涉及到动态内存开辟:
wap( int* p1,int* p2 )
{
int * p;
*p = *p1;
*p1 = *p2;
*p2 = *p;
}
p 为野指针(指向⼀个已删除的对象或未申请访问受限内存区域的指针)
void swap(int *pa, int *pb)
{
int tmp;
tmp = *pa;
msgbox中文乱码
*pa = *pb;
*pb = tmp;
}
6.C 和 C++ 的 struct 有什么不同
c和c++ 中struct的主要区别是c中的struct不可以含有成员函数,⽽c++ 中的struct可以.
c++ 中struct和class的主要区别在于默认的存取权限不同,struct默认为public ,⽽class默认为private 7.会出现什么错误;什么原因?
char str[10];strcpy(str, "0123456789");
8.数组和链表的区别:
数组:数据顺序存储,固定⼤⼩;
链表:数据可以随机存储,⼤⼩可动态改变;
9.会出现什么问题?打印结果是是多少?
void main()
{
char aa[10];
printf(“%d”,strlen(aa));
}怎么获取input里面的值
sizeof()和初不初始化,没有关系,
strlen()和初始化有关,打印结果值未知.
10.的结果是否相同?其中ptr为同⼀个指针.
(void *)ptr 和(*(void**))ptr
(void *)ptr 和(*(void**))ptr 值是相同的
11.要对绝对地址0x100000赋值,我们可以⽤
冒泡排序代码c语言(unsigned int*)0x100000 = 1234;那么要是想让程序跳转到绝对地址是0x100000去执⾏,应该怎么做?
*((void (*)( ))0x100000 ) ( );
⾸先要将0x100000强制转换成函数指针,即:
(void (*)())0x100000
然后再调⽤它:
*((void (*)())0x100000)();
12.关键字 volatile 有什么含意? 并给出三个不同的例⼦。
⼀个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设
这个变量的值了。精确地说就是,优化器在⽤到这个变量时必须每次都⼩⼼地重新读取这个变量的值,
⽽不是使⽤保存在寄存器⾥的备份。下⾯是volatile变量的⼏个例⼦:
已经阻止activex控件1). 并⾏设备的硬件寄存器(如:状态寄存器)
2). ⼀个中断服务⼦程序中会访问到的⾮⾃动变量(Non-automatic variables)
3). 多线程应⽤中被⼏个任务共享的变量
13.头⽂件中的ifndef/define/endif ⼲什么⽤?
防⽌该头⽂件被重复引⽤:
14.#include <filename.h> 和#include “filename.h” 有什么区别?
对于#include <filename.h> ,编译器从标准库路径开始搜索filename.h ;
对于#include “filename.h” ,编译器从⽤户的⼯作路径开始搜索filename.h 。
(1)可以定义const 常量
(2)const 可以修饰函数的参数、返回值,甚⾄函数的定义体。被const 修饰的东西都受到强制保护,可
以预防意外的变动,能提⾼程序的健壮性。
16.static有什么⽤途?(请⾄少说明两种)
1.限制变量的作⽤域(static全局变量);
floating charges2.设置变量的存储域(static局部变量).
17.如何引⽤⼀个已经定义过的全局变量?
可以⽤引⽤头⽂件的⽅式,也可以⽤ extern 关键字,如果⽤引⽤头⽂件⽅式来引⽤某个在
头⽂件中声明的全局变理,假定你将那个变量写错了,那么在编译期间会报错,如果你⽤extern ⽅式引⽤
时,假定你犯了同样的错误,那么在编译期间不会报错,⽽在连接期间报错。
18.全局变量可不可以定义在可被多个.C ⽂件包含的头⽂件中?为什么?
可以,在不同的C ⽂件中以static形式来声明同名全局变量。可以在不同的C⽂件中声明同名的全
局变量,前提是其中只能有⼀个C⽂件中对此变量赋初值,此时连接不会出错
19.栈和队列有什么区别
队列先进先出,栈后进先出
20.Heap与stack的差别
Heap是堆,stack是栈。
Stack的空间由操作系统⾃动分配/释放,Heap上的空间⼿动分配/释放。
Stack空间有限,Heap是很⼤的⾃由存储区C 中的malloc 函数分配的内存空间即在堆上,C++中对
应的是new 操作符。程序在编译期对变量和函数分配内存都在栈上进⾏,且程序运⾏过程中函数调⽤时参数的传递也在栈上进⾏21.⽤宏定义写出swap(x,y),即交换两数
#define swap(x, y) (x)=(x)+(y);(y)=(x)–(y);(x)=(x)–(y);
22.写⼀个“标准”宏,这个宏输⼊两个参数并返回较⼩的⼀个。
#define Min(X, Y) ((X)>(Y)?(Y):(X))
23.带参宏与带参函数的区别(⾄少说出5点)?
| 带参宏 | 带参函数 |
| 处理时间 | 编译时 | 运⾏时 |
| 参数类型 | ⽆ |
| 需定义 |
| 程序长度 | 变长 |
| 不变 |
| 占⽤存储空间 | 否 | 是 |
| 运⾏时间 | 不占运⾏时间 | 调⽤和返回时占 |
24. main() 中,c标准认为0表⽰成功,⾮0表⽰错误。具体的值是某中具体出错信息
25.已知⼀个数组tabl e ,⽤⼀个宏定义,求出数据的元素个数。
#define NTBL(table) (sizeof(table)/sizeof(table[0]))
26.A.c 和B.c两个c⽂件中使⽤了两个相同名字的static变量,编译的时候会不会有问题?这两个static变量会保存到哪⾥(栈还是堆或者其他的)?
static的全局变量,表明这个变量仅在本模块中有意义,不会影响其他模块。
他们都放在静态数据区,但是编译器对他们的命名是不同的。如果要使变量在其他模块也有意义的话,需要使⽤extern 关键字。
27.static全局变量与普通的全局变量有什么区别?
static全局变量只初使化⼀次,防⽌在其他⽂件单元中被引⽤;
28.static局部变量和普通局部变量有什么区别
static局部变量只被初始化⼀次,下⼀次依据上⼀次结果值;
29.static函数与普通函数有什么区别?
static函数在内存中只有⼀份,普通函数在每个被调⽤中维持⼀份拷贝
30.static 参考⽂章:
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本⾝就是静态存储⽅式,静态全局变量当然也是静态存储⽅
式。这两者在存储⽅式上并⽆不同。这两者的区别虽在于⾮静态全局变量的作⽤域是整个源程序,当⼀个源程序由多个源⽂件组成时,⾮静态
的全局变量在各个源⽂件中都是有效的。⽽静态全局变量则限制了其作⽤域,即只在定义该变量的源⽂件内有效,在同⼀源程序的其它源⽂件中不能使⽤它。由于静态全局变量的作⽤域局限于⼀个源⽂件内,只能为该源⽂件内的函数公⽤,因此可以避免在其它源⽂件中引起错误。
从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储⽅式即改变了它的⽣存期。把全局变量改变为静态变量后是改变了它的
作⽤域,限制了它的使⽤范围。static函数与普通函数作⽤域不同。仅在本⽂件。只在当前源⽂件中使⽤的函数应该说明为内部函数(static),
内部函数应该在当前源⽂件中说明和定义。对于可在当前源⽂件以外使⽤的函数,应该在⼀个头⽂件中说明,要使⽤这些函数的源⽂件要包含这个头⽂件
31.程序的局部变量存在于栈(stack) 中,全局变量存在于静态数据区中,动态申请数据存在于堆(heap)中。
32.程序的预处理,预编译,连接,汇编等
:见课本;
33.⽤两个栈实现⼀个队列的功能?要求给出算法和思路!
设2个栈为A,B, ⼀开始均为空.⼊队:
将新元素push⼊栈A;
出队:
(1)判断栈B 是否为空;
(2)如果不为空,则将栈A中所有元素依次pop 出并push到栈B;
(3)将栈B 的栈顶元素pop 出;
34.对⼀个频繁使⽤的短⼩函数 C语⾔⽤什么实现
: c⽤宏定义,c++ ⽤inline
35.1. ⽤预处理指令#define 声明⼀个常数,⽤以表明1年中有多少秒(忽略闰年问题)
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
36.在C++ 程序中调⽤被C 编译器编译后的函数,
为什么要加extern “C”?
C++ 语⾔⽀持函数重载,C 语⾔不⽀持函数重载。函数被C++ 编译后在库中的名字与 C 语⾔的
不同。假设某个函数的原型为:void foo(int x, int y); 该函数被C 编译器编译后在库中的名字为_foo ,⽽
C++ 编译器则会产⽣像_foo_int_int之类的名字。 C++提供了C 连接交换指定符号extern“C”来解决名字匹配问题。
37.以下是求⼀个数的平⽅的程序,请出错误:
#define SQUARE(a)((a)*(a))
int a=5;
int b;
b=SQUARE(a++);
宏在预编译时会以替换的形式展开,仅仅会替换。涉及到宏的地⽅,不要⽤+±- ,标准中对此没有规定,因此最终结果将会依赖于不同的编译器。执⾏程序的答案可能是25、也有可能是36。
38.编写strcpy 函数
已知strcpy 函数的原型是 char *strcpy(char *strDest, const char *strSrc);其中strDest是⽬的字符串,strSrc 是源字符串。
不调⽤C++/C 的字符串库函数,请编写函数strcpy 。
strcpy 能把 strSrc 的内容复制到strDest,为什么还要char * 类型的返回值?
39.写出⼆分查的代码。
int binary_search(int* arr, int k ey, int n){
int low =  0;int h igh = n - 1 ;int mid;
while (low <= high){
mid = (high + low) / 2;
if (arr[mid] > k) high = mid -1 ;
else if (arr[mid] < k) low = mid + 1;
乌克兰和俄罗斯的历史恩怨else return mid;
}
return -1;
}
40.请编写⼀个C 函数,该函数给出⼀个字节中被置1 的位的个数。
unsigned int TestAsOne0(char log) {
int i; unsigned int num=0, val;
for(i=0; i<8; i++) {
va l =  log >>  i;  // 移位
val & = 0x01;  // 与1 相与
if(val) num++;
}
return num;
}
41.请编写⼀个C 函数,该函数将给定的⼀个字符串转换成整数。
int Invert(char* str) {
int num =0;
while(*str!='\0') {
int d igital=*str-48; num=num*10+digital; str=str+1;
}
return num;
}
42.请编写⼀个C 函数,该函数将给定的⼀个整数转换成字符串。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。