C语言面试题(经典全).docx
《C语言面试题(经典全).docx》由会员分享,可在线阅读,更多相关《C语言面试题(经典全).docx(39页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1. static有什么用途?(请至少说明两种)1)限制变量的作用域2)设置变量的存储域(堆,主动支配内存也是堆)1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内 所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。3)在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调 用。那就是,这个函数被限制在声明它的模块的本地范围内运用。4,全局变量和局部变量在内存中是否有区分?假如有,是什么区分?全局变量储存在静态数据库,局部变量在栈6.堆栈溢出一般是由什么缘由导致的?堆栈溢出一般是循环的递
2、归调用导致的,假如运用的大数据结构的局部变量, 也可能导致堆栈溢出。 没有回收垃圾资源导致的是内存泄露最终内存耗尽。20.不能做switch。的参数类型是:switch的参数不能为实型。(只能是int char)9.写出float x与“零值”比较的if语句。 too;DATE max;则语句 printf (/,%d/, sizeof (struct data句sizeof (max);的执行结果是:考点:区分struct与union.(一般假定在32位机器上)答:DATE是一个union,变量公用空间.里面最大的变量类型是int5,占用20 个字节.所以它的大小是20. data是一个st
3、ruct,每个变量分开占用空间.依次 为int4 + DATE20 +double8 = 32.所以结果是 20 + 32 = 52.10、请找出下面代码中的全部错误(题目不错,值得一看)说明:以下代码是把一个字符串倒序,如“abed”倒序后变为“deba”#includez/string. hmain ()char*src=/hello, world”;char* dest=NULL;int len=strlen(sre);dest=(char*)malloc(len);char* d=dest;char* s=srclen;while(len-!=0)*d+=*s;printf (/z%s
4、z/, dest);答:方法1: 一共有4个错误;int main ()(char* src = hello, world”;int len = strlen (src);char* dest =(char*)manoc (len+1);要为支配一个空间char* d = dest;char* s = &srclen-l;指向最终一个字符while( len- != 0 )*d+=*s;*d = 0;尾部要加0printf(sn,dest);free(dest);运用完,应当释放空间,以免造成内存汇泄露dest = NULL;防止产生野指针return 0;)方法2:(方法一须要额外的存储空间
5、,效率不高.)不错的想法ftinclude ftinclude main ()(charstr =/zhello, world”;intlen=strlen (str);char t;for(int i=0;ilen/2; i+)t=stri;stri=strlen-i-l ;/当心一点str len-i-l=t;printf(%s,str);return 0;3. Heap与stack的差别。答:Heap是堆,stack是栈。Stack的空间由操作系统自动支配/释放,Heap上的空间手动支配/释放。Stack空间有限,Heap是很大的自由存储区C中的malloc函数支配的内存空间即在堆上,C
6、+中对应的是new操作符。程序在编译期对变量和函数支配内存都在栈上进行,且程序运行过程中函数调用 时参数的传递也在栈上进行/ 124 8 16ooo/ 11010010001 0000/ o 111 in mi3 一语句实现x是否为2的若干次幕的推断#def ine is2*n(x) (x & (x - 1)? 0 : 1) int main (void) int m 二 512; cout (m & (m - 1) ? false : true) endl;/即当m中只有一位为1时丁才为若干次嘉值考试大提示:若有两个及以上L则(m & (m-1)不为0,输出0,表示不为2的若干次哥 retu
7、rn(0) ; 类比:x为2的若干次幕即表示x中1的位数为1,题目转化为求一个32位数中1的位数,假 如为1,则表示该数为2的若干次幕同理也可以利用此规则求一个32位数中1的位数,(m & (m - 1)每次可用消退一个1,计算的次数即为1的个数!2 .下述三个有什么区分?char* const p;charconst * pconstchar *p解答:char * const p; 常量指针,p的值不行以修改char const * p; 指向常量的指针,指向的常量值不行以改const char *p; /和char const *p3 .说明下列输出结果charstrl = abc;ch
8、arstr2 = abc;constcharstr3 = abc;constcharstr4 = abc;constchar*str5 = abc;constchar*str6 = abc;char*str7 = abc;char*str8 = abc;cout ( strl = str2endl;cout ( str3 = str4endl;cout ( str5 = str6endl;cout ( str7 = str8endl;结果是:0 0 11解答:strl, str2, str3, str4是数组变量,它们有各自的内存空间;而str5, str6, str7, str8是指针,它们
9、指向相同的常量区域。节约内存。4 .以下代码中的两个sizeof用法有问题吗? C易ftinclude ftinclude iostream. h void Uppercase ( char str ) /将str中的小写字母转换成大写字母 int i;for ( i=0; isizeof (str)/sizeof (str0) ; +i )是指针的大 小4,只循环了4次。数组做参数,会退化为指针。可改为strlen(str)if ( a二str i& str i =,)stri -=(aA);由小写 转大写void main()char str 二aBcDefg”;cout str字符长度为
10、: sizeof (str)/sizeof (str 0) endl; /是数组的大小6Uppercase( str );cout str endl;答:函数内的sizeof有问题。依据语法,sizeof如用于数组,只能测出静态数组 的大小,无法检测动态支配的或外部数组大小。函数外的str是一个静态定义的 数组,因此其大小为8,函数内的str实际只是一个指向字符串的指针,没有任何 额外的与数组相关的信息,因此sizeof作用于上只将其当指针看,一个指针为4 个字节,因此返回4。留意:数组名作为函数参数时,退化为指针.数组名作为sizeof ()参数时, 数组名不退化,因为sizeof不是函 数
11、.4 . 一个32位的机器,该机器的指针是多少位 2132 =4G地址总线宽度确定了CPU可以访问的物理地址空间.简洁地说就是CPU原委能够 运用多大容量的内存.对于386以上的微机系统.地址线的宽度为32位.最多可以 干脆访问4096MB (4GB)的物理空间.对大多数人来说已经够用了.指针是多少位只要看地址总线的位数就行了。80386以后的机子都是32的数据总 线。所以指针的位数就是4个字节了。8位处理器、16位处理器、32位处理器和64位处理器,其计数都是8的倍数。它表 示一个时钟周期里,处理器处理的二进制代码数。“0”和“1”就是二进制代码, 线路上有电信号,则计做1,没有电信号则为0
12、。8位机有8条线路,每个时钟周期 有8个电信号,组成一个字节。所以,随8位处理器上升至64位处理器,每个时钟 周期传送1个字节到8个字节,关联到时钟速度提高到若干个千兆赫之后,处理器 处理信息的实力越来越大。CPU的一次基本运算(and, or, xor, not),能处理/运算几个bits. 64 bits data交由32-bit CPU去运算,得分两次才行.5 .指出下面代码的输出,并说明为什么。(不错,对地址驾驭的深化挖潜)main ()int a5 = l, 2, 3, 4, 5;int *ptr=(int *) (&a+l);指针是数组类型,+1相当于加20.假如是(a+1)是+4
13、printf( a%d %dv, a, ptr);printf Cz%d, %d,*(a+l), *(ptrT);输出:1245036 1245056 2,5a, &a的地址是一样的,但意思不一样,a是数组首地址,也就是a0的地址,&a 是对象(数组)首地址,a+1是数组下一元素的地址,即al,&a+l是下一个对象 的地址,即a5.6 .请问以下代码有什么问题:1) .intmain ()char a;char *str=&a;strcpy (str, hello);printf(str);return 0;答;没有为str支配内存空间,将会发生异样问题出在将一个字符串复制进一个字符变量指针所
14、指地址。虽然可以正确输出结 果,但因为越界进行内在读写而导致程序崩溃。2) .char*s=AAA”;常量的内容不能改,可定义为数组printf(%s,s);s0=,B,;printf(%s,s);有什么错?答:AAA是字符串常量。s是指针,指向这个字符串常量,所以声明s的时候就 有问题。cosnt char* s=AAA;然后又因为是常量,所以对是s0的赋值操作是不合法的。7 .用变量a给出下面的定义a)一个整型数(An integer) b) 一个指向整型数的指针(A pointer to an integer) c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer
15、 to a pointer toan integer) d) 一个有10个整型数的数组(An array of lOintegers) e) 一个有10个指针的数组,该指针是指向一个整型数的(Anarray of 10 pointers to integers) f) 一个指向有10个整型数数组的指 针(A pointerto an array of 10 integers) g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a functionthat takes an integer as an argument and returns an int
16、eger) h)个有10个函数指针 的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数(An array of ten pointers to functions that take an integer argumentand return an integer )答案是:Int (*p10) (int) ;a) int a; / An integer b) int *a; / A pointer to an integer c) int *a; / A pointer to a pointer to an integer d) int a10; / An array of 1
17、0 integers e) inta10 ; / An array of 10 pointers to integers f) int (*a) 10 ; / A pointer to an arrayof 10 integers g) int (*a) (int) ;/ A pointer to a function a that takes an integer argumentand returns an integer h) int (*a10)(int) ; / An array of 10 pointers to functions that take aninteger argu
18、ment and return an integer3 .用预处理指声明一个常数,用以表明1年中有多少秒(忽视闰年问 题)define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL4 .写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。ftdefine MIN( A, B) (A) = (B) ? (A) : (B) A const int a;2 int const a;3 4内容不行变,指针可变:constint *a;5、内容不行变,指针可变:int * const a;6、内容可变,指针不行变: intconst * const a;8.关键
19、字volatile有什么含意并给出三个不同的例子。一个定义为volatile的变量是说这变量可能会被意想不到地变更,这样,编译器 就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必需每次都当心地重新读取这个变量的 值,而不是运用保存在寄存器里的备份。下面是volatile变量的几个例子:1) .并行设备的硬件寄存器(如:状态寄存器)2) . 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)3) .多线程应用中被几个任务共享的变量3.在c语言库函数中将一个字符转换成整型的函数是atol ()吗,这个函数的原型 是什么?函数名:atol功能
20、:把字符串转换成长整型数函数的原型:long atol (const char *nptr);程序例:ftinclude ftinclude int main (void)(long 1;char *str = 98765432”;1 = atol(Istr);printf(string = %s integer =str, 1);return (0);1.对于一个频繁运用的短小函数,在C语言中应用什么实现,在C+中应用什么实 现?c用宏定义,c十1用inline6. int (*s10) (int)表示的是什么啊int (*s10) (int)函数指针数组,每个指针指向一个int func(
21、int param)的 函数。1.有以下表达式:inta=248; b=4;int const c=21;const int *d=&a;int*const e=&b;int constint *const f =&a;请问下列表达式哪些会被编译器禁止?为什么?*c=32;d=&b;*d=43;e=34;e=&a;f=0x321f;答:*c这是个什么东东,禁止d=&b是很OKe二34不OKe = &a说了是const禁止e的地址不能改const int *const f =&a;禁止 f的内容和地址都不能改2.交换两个变量的值,不运用第三个变量。即a=3, b=5,交换之后a=5, b=3;答
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 试题 经典
限制150内