1、最新软件类工作应聘笔试题精品 1.static有什么用途?(请至少说明两种)1).限制变量的作用域2).设置变量的存储域2.引用与指针有什么区别?1).引用必须被初始化,指针不必。2).引用初始化以后不能被改变,指针可以改变所指的对象。2).不存在指向空值的引用,但是存在指向空值的指针。3.全局变量和局部变量在内存中是否有区别?如果有,是什么区别?全局变量储存在静态数据库,局部变量在堆栈4、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。
2、全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中 都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错 误。从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。
3、static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝5、请找出下面代码中的所有错误说
4、明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”1、#includestring.h2、main()3、4、 char*src=hello,world;5、 char* dest=NULL;6、 int len=strlen(src);7、 dest=(char*)malloc(len);8、 char* d=dest;9、 char* s=srclen;10、 while(len-!=0) 11、 d+=s-;12、 printf(%s,dest);13、 return 0;14、 答:方法1:int main()char* src = hello,world;int l
5、en = strlen(src);char* dest = (char*)malloc(len+1);/要为0分配一个空间char* d = dest;char* s = &srclen-1;/指向最后一个字符while( len- != 0 )*d+=*s-;*d = 0;/尾部要加0printf(%sn,dest);free(dest);/ 使用完,应当释放空间,以免造成内存汇泄露return 0;方法2:#include #include main()char str=hello,world;int len=strlen(str);char t;for(int i=0; i 0) *ps
6、To+ = *psFrom+;eturn pvTo;16. 斐波拉契数列递归实现的方法如下:int Funct( int n ) if(n=0) return 1; if(n=1) return 1; retrurn Funct(n-1) + Funct(n-2);请问,如何不使用递归,来实现上述函数?请教各位高手!解答:int Funct( int n ) / n 为非负整数 int a=0; int b=1; int c; if(n=0) c=1; else if(n=1) c=1; else for(int i=2;i=n;i+) /应该n从2开始算起 c=a+b; a=b; b=c;
7、return c;17. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL18.18. 写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。#define MIN(A,B) (A) = (B) (A) : (B)19.预处理器标识#error的目的是什么?#error 停止编译并显示错误信息20. 9. 嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它
8、位不变。#define BIT3 (0x13)static int a;void set_bit3(void)a |= BIT3;void clear_bit3(void)a &= BIT3;21. 嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换(typecast)为一指针是合法的。这一问题的实现方式随着个人风格不同而不同。典型的类似代码如下:int *ptr;ptr = (int *)0x67
9、a9;*ptr = 0xaa55;22.中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展让标准C支持中断。具代表事实是,产生了一个新的关键字 _interrupt。下面的代码就使用了_interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。_interrupt double compute_area (double radius)double area = PI * radius * radius;printf( Area = %f, area);return area;这个函数有太多的错误了,以至让人不知从何说起了:1). ISR 不能返回一个
10、值。如果你不懂这个,那么你不会被雇用的。2). ISR 不能传递参数。如果你没有看到这一点,你被雇用的机会等同第一项。3). 在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。4). 与第三点一脉相承,printf()经常有重入和性能上的问题。如果你丢掉了第三和第四点,我不会太为难你的。不用说,如果你能得到后两点,那么你的被雇用前景越来越光明了。代码例子(Code examples)23.切换目录、查看文件、重启、修改文件权限、删除文件的L
11、inux命令2. linux 基本命令重启shutdown - h now 立刻关机shutdown - r now 重启reboot 重启2.1 文件查看和连接命令cat cat 选项 more 显示文件内容,带分页less 显示文件内容,带分页2.2命令的操作more more 选项 分屏显示命令less less 选项 按页显示命令clear 清除屏幕命令history 查看历史命令记录2.3目录相关命令cd . 可进入上一层目录cd - 进入上一个进入的目录cd 可进入用户的home目录pwd 显示当前在哪个路径ls 列出文件和目录ls -a 显示隐藏文件ls -l 显示常列表格式mk
12、dir 建立目录rmdir 删除空目录touch 建立空文件2.4.1文件操作mv 移动文件和改文件 将档案 aaa 更名为 bbb:将所有的C语言程式移至 Finished 子目录中:mv -i *.crm 删除文件和目录rm -rf * 删除所有内容(包括目录和文件)如何修改文件的访问权限chmod 777 along24、输入a,b,c三个整数,然后输出其中的最大值,注意算法效率a=ab?a:b;a=ac?a:c;25、x86处理器中,物理页面的大小是_4K_26、编译过程的五个阶段编译程序的工作过程一般也可以划分为五个阶段:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成
13、。27、i=i+1 i+ +I的区别? 请高手解释一下.计算机内部实现过程有别,详细如下:i=i+1的过程相当:temp=i+1;i=temp;i+的过程相当:temp=i;i=temp+1;return temp;+i的过程最简单:i增1然后return i 的值,一步完成,没有给任何temp变量赋值:)28、进程和线程的区别?进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执、行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进
14、程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。29、用C语言写一个函数判断处理器的大小端?Int checkCPU() union w ; int a; char b; c;c.a=1;return (c.b=1);若返回0,则为大端处理器;返回1,则为小端处理器。30、写出GCC的编译过程(源文件为Hello.c)?第一步 预处理 命令:gcc E Hello.c o Hello.i第二步 编译及优化 命令: gcc S Hello.i -o Hello.s 第三步 汇编 命令: gcc -c Hello.s -o Hello.o第四步 链接 命令: gcc Hello.o -o Hello31、计算1+2+.+100的值#include main()printf(%dn,fun(100);/调用函数fun()fun(int n) /递归函数int t;if(n=0|n=1)t=1; /如果n为0或为1 输出1else t=n+fun(n-1);return t;