分享

C面试题

 昵称8442 2010-03-17

1、sizeof()和strlen()的使用?  
 
答:  
 
    1.从功能定义上,strlen函数,用来求字符串的长度,sizeof函数是用来求指定变量或变量类型等所占用内存的  
 
 
 
大小;  
 
    2.sizeof是运算符,而strlen是C库函数strlen只能用char*做参数,且以'\0'结尾的;  
 
  对于静态数组处理:  
 
     char str[20]="0123456789";  
 
     strlen(str)=10;   //表示数组中字符串的长度  
 
     sizeof(str)=20;   //表示数组变量分配的长度  
 
  对于指针处理:  
 
     char *str="0123456789";  
 
     strlen(str)=10;     //表示字符串的长度  
 
     sizeof(str)=4;      //表示指针变量的所占内存大小  
 
     sizeof(*str)=1;     //表示'0'这个字符变量的所占内存大小  
 
 
 
2、 struct 和 class的区别?  
 
答:  
 
   (1)类中的成员默认是private的,当是可以声明为public,private 和protected,结构中定义的成员默认的都是  
 
 
 
public.  
 
   (2)结构中不允许定义成员函数,当是类中可以定义成员函数.  
 
   (3)结构不可以存在继承关系,当是类可以存在继承关系.  
 
3、 strcpy(), strcat(), strcmp,strlen(), strchr(), memcpy(), memcmp(), memset()的编写?  
 
 
 
4、 内存的分配方式的分配方式有几种?  
 
答:  
 
   (1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如  
 
 
 
全局变量。  
 
   (2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元  
 
 
 
自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。  
 
   (3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在  
 
 
 
何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。  
 
 
 
5,、解释堆和栈的区别?  
 
答:  
 
   (1)栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中  
 
 
 
的栈。  
 
   (2)堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的  
 
 
 
堆是两回事,分配方式倒是类似于链表.(主要有:malloc/free,new/delete)  
 
 
 
6,、枚举的用法,以及它与宏的区别?  
 
答:  
 
    枚举(enum)作用:定义一组常量,而且这些常量组成了一个集合。当我们将emun参数传递给函数时,如果传递了  
 
 
 
一个不属于这个集合的参数,编译器报错。  
 
    区别:  
 
    枚举是类型,而宏没有类型。  
 
    枚举将检查其语法,而宏是简单的文本替换。  
 
 
 
7、 const的用法,以及声明const变量与宏的区别?  
 
答:  
 
   const的用法有四种:  
 
   a): const对象和const类型的对象;  
 
   b): const指针 和 指向const的指针 及两者结合;  
 
   c): const 参数修饰 和 参数返回类型的const修饰;  
 
   d): const类成员 和 const 成员函数;  
 
   区别:  
 
   const常量有数据类型, 而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只能进行字符  
 
 
 
替换,没有类型  
 
   安全检查。而且字符替换可能会带来料想不到的边界效应。  
 
   有些集成化工具可以对const常量进行调试, 但不能对宏量进行调试。  
 
 
 
8、函数assert的用法?  
 
答:  
 
   断言assert是仅在debug版本起作用的宏,用于检查“不应该“发生的情况。程序员可以把assert看成一个在任  
 
 
 
何系统状态下都可以安全使用的无害测试手段。  
 
 
 
9、用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)?  
 
答: 
 
   #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL  
 
 
 
10、 写一个"标准"宏MIN,这个宏输入两个参数并返回较小的一个?  
 
答: 
 
   #define MIN(A,B) ((A) <= (B) ? (A) : (B))   
 
 
 
11、嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?  
 
答:  
 
   这个问题用几个解决方案。我首选的方案是:  
 
   while(1)  
 
   {  
 
   }  
 
 
 
   一些程序员更喜欢如下方案:  
 
   for(;;)  
 
   {  
 
   }  
 
 
 
12、用变量a给出下面的定义  
 
a) 一个整型数(An integer)   
 
答:a)     int a; // An integer   
 
b)一个指向整型数的指针( A pointer to an integer)   
 
答:b)     int *a; // A pointer to an integer   
 
c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to an intege)  
 
答:c)     int **a; // A pointer to a pointer to an integer   
 
d)一个有10个整型数的数组( An array of 10 integers)   
 
答:d)     int a[10]; // An array of 10 integers   
 
e) 一个有10个指针的数组,该指针是指向一个整型数的。(An array of 10 pointers to integers)   
 
答:e)     int *a[10]; // An array of 10 pointers to integers   
 
f) 一个指向有10个整型数数组的指针( A pointer to an array of 10 integers)   
 
答: f)     int (*a)[10]; // A pointer to an array of 10 integers   
 
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an   
 
 
 
integer as an argument and returns an integer)   
 
答:g)    int (*a)(int); // A pointer to a function a that takes an integer argument and returns an   
 
 
 
integer   
 
h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten   
 
 
 
pointers to functions that take an integer argument and return an integer )  
 
答:h)    int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument   
 
 
 
and return an integer   
 
 
 
13、关于内存对齐的问题以及sizof()的输出?   
 
答:  
 
   编译器自动对齐的原因:为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于  
 
 
 
,为了访问未对齐的内存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访问。  
 
 
 
14、 static有什么用途?(请至少说明两种)  
 
答:  
 
   (1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。  
 
   (2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数  
 
 
 
访问。它是一个本地的全局变量。  
 
   (3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它  
 
 
 
的模块的本地范围内使用。  
 
 
 
15、引用与指针有什么区别?  
 
答:  
 
   (1) 引用必须被初始化,指针不必。  
 
   (2) 引用初始化以后不能被改变,指针可以改变所指的对象。  
 
   (3) 不存在指向空值的引用,但是存在指向空值的指针。  
 
 
 
16、什么是平衡二叉树?  
 
答:  
 
   左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于1。  
 
 
 
17、堆栈溢出一般是由什么原因导致的?  
 
答:  
 
   没有回收垃圾资源。  
 
 
 
18、什么是预编译?何时需要预编译?  
 
答:  
 
   (1)总是使用不经常改动的大型代码体。   
 
   (2)程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有  
 
 
 
包含文件预编译为一个预编译头。  
 
 
 
19、队列和栈有什么区别?  
 
答:   
 
   队列先进先出;栈后进先出。  
 
 
 
20、数组和链表的区别?  
 
答:  
 
   数组:数据顺序存储,固定大小;  
 
   链表:数据可以随机存储,大小可动态改变;  
 
 
 
21、为什么数组名作为参数,会改变数组的内容,而其它类型如int却不会改变变量的值?  
 
答:  
 
   当数组名作为参数时,传递的实际上是地址。而其他类型如int作为参数时,由于函数参数值实质上是实参的一  
 
 
 
份拷贝,被调函数内部对形参的改变并不影响实参的值。  
 
 
 
22、数据结构和算法:   
 
A:查找:  
 
(1)二分法查找;  
 
(2)  
 
(3)  
 
(4)  
 
B:写出下列算法的时间复杂度和实现排序:  
 
(1)冒泡排序;   
 
(2)选择排序;   
 
(3)插入排序;   
 
(4)快速排序;   
 
(5)堆排序;   
 
(6)归并排序;  
 
 
 
23、编写gbk_strlen函数,计算含有汉字的字符串的长度,汉字作为一个字符处理;已知:汉字编码为双字节,其中  
 
 
 
首字节<0,尾字节在0~63以外;(如果一个字节是-128~127)? 


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/luoweihui/archive/2008/06/29/2595831.aspx

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多