现在的位置: 首页 > 综合 > 正文

程序员面试笔试知识点总结2

2017年11月21日 ⁄ 综合 ⁄ 共 2363字 ⁄ 字号 评论关闭

1、枚举变量

定义:枚举变量的值默认从0开始递增,当设置了某个成员的值时,后面的值在此基础上递增。enum t{a, b, c=3, d, e=6,f};那么a=0, b=1, c=3, d=4, e=6, f=7
使用:枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。例如对枚举weekday的元素再作以下赋值:sun=5;mon=2;sun=mon; 都是错误的。
赋值:只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。如:a=sum; b=mon; 是正确的。而:a=0; b=1; 是错误的。如一定要把数值赋予枚举变量,则必须用强制类型转换,如:a=(enum weekday)2; 其意义是将顺序号为2的枚举元素赋予枚举变量a,相当于:a=tue; 还应该说明的是枚举元素不是字符常量也不是字符串常量, 使用时不要加单、双引号。

2、下面定义中:为什么str1和str2地址不同,而p1和p2地址相同。

const char str1[] = "abc";         
const char str2[] = "abc";
const char *p1 = "abc";
const char *p2 = "abc";     

       因为str1和str2是在栈上分配的,从高地址到低地址分配,所以不相等。而p1和p2两个指针指向的是同一地址,编译器认为p1指向的"abc”和p2指向的"abc”是属于同一常量,很多书上都有这个提示。

3、为什么有时候main( )函数会带参数?参数argc与argv的含义是什么

     这是C语言中的命令行参数,所谓命令行参数,就是在DOS下执行命令所需要的参数,我们学习C语言的时候,一般都是编一些小程序,输出一些数据了等等,但是如果我们编制这样一个程序,比如编制一个程序能把一个文件的内容追加到另外一个文件中,这样我们编的程序就需要你提供命令的后面两个文件名(和命令一起称做命令行参数) 如这个程序叫做append使用时候(在dos下敲入如下命令)如下使用append   file1.c  
file2.c
就可以完成file1.c的,内容追加到file2.c中。那么几个字符串:append、file1.c和file2.c三个实参传给谁呢,这就需要在main()函数定义一些形式参数用来接收这些实参在命令行中输入的字符串的个数就存储在argc当中,三个字符串的内容存储char *argv[]当中这样在定义的时候主函数就定义为:void main(int argc,char *argv[])

        比如有以下一个程序:假如文件名称叫做test.c,里面的内容是

void main(int argc, char *argv[])  
 {        
	int   i;        
	printf("the command prameter number is %d",argc);  
	for(i=0;i<argc;i++) 
		printf("%s ",argv[i]); 
	printf("\n");

	getchar();
 }

程序在编译运行以后,在提示符下输入:test aaaaaa bbbbbb然后回车,则输出结果为:the command prameter number is 3 test aaaaaa bbbbbb注意:argc中统计了参数的个数,本例参数个数为3个;其中,argv[0]中存储的是:test,argv[1]中存储的是aaaaaa,argv[2]中存储的是bbbbbb。因此,如果我们要编写一些要执行命令的程序的话,必须就要用到命令行参数,比如dos下的copy、rename等命令,等需要有有多个参数。

4、C++里面是不是所有的动作都是main()引起的?


C++里面的动作不是全部有main()引起的,例如全局变量的初始化工作,在main()函数的执行前进行。但是这个初始化动作并不能为编译器的断点所截断。

各类情况下的入口点函数

mbcs的console程序的默认起点是main,
unicode的console程序是wmain
unicode的windows应用程序wWinMain
mbcs的windows应用程序是WinMain
unicode和mbcs的dll则是  DllMain

5、C语言中 *p++和 *(p++)是等价的吗?为什么

结果是等价的
*和++的运算级是一样的,但是他们都是单目运算符,是从右向左运算的!
在这里,*p++是先进行p++,此时是先取p的值,所以*p它取的还是p所指的值,*(p++)也是先取p的值自加,所以*p它取的还是p所指的值,因此二者是一样的。

 6、C和C++怎么分配和释放内存,区别是什么

C:malloc和free,是函数,不在编译器控制的权限之内。另calloc()会初始化,realloc会重置大小。

C++:new和delete,是运算符,所以在编译器控制的权限之内,会调用构造函数和析构函数。

另外,如果没有足够的内存,malloc返回的是null,而new会抛出一个异常,并且可以为这种情况写一个特殊的处理函数,用set_newhandler来指定这个函数。

7、进程与线程的区别和联系

程序与进程

程序:一段静态的代码

进程:程序的一次动态执行过程

进程与线程

进程:进程是进程实体(程序段 数据段 PCB)的运行过程,是系统进行资源分配和调度的一个独立单位

线程:又称轻量级进程(lightweight process),是进程中某个单一顺序的控制流

一个进程至少有一个线程,一个线程一定属于某一个进程。

进程与线程的区别

地址空间和资源:进程间相互独立,同一进程的线程间共享。线程只有自己的栈和计数器,其余资源都是进程拥有,线程共享。

通信:线程间可以直接通信(共享区),进程需要别的手段(信号、信号量、共享存储、管道通信、消息队列)

调度:线程切换更快,线程是独立调度的基本单位,进程是独立资源分配的基本单位。

抱歉!评论已关闭.