转基因技术是否安全:笔试总结 - 笔试相关 - 技术!专业

来源:百度文库 编辑:九乡新闻网 时间:2024/07/04 20:10:08

2、如何引用一个已经定义过的全局变量?
        答:可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。


3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?
        答:可以,在不同的C文件中以static形式来声明同名全局变量。
        可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。

1、什么是预编译,何时需要预编译?
       总是使用不经常改动的大型代码体。 
       程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。

1、 static有什么用途?(请至少说明两种)
       限制变量的作用域
       设置变量的存储域
2、引用与指针有什么区别?
1) 引用必须被初始化,指针不必。
2) 引用初始化以后不能被改变,指针可以改变所指的对象。
3) 不存在指向空值的引用,但是存在指向空值的指针。

5、 什么是平衡二叉树?
        左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于1.
6、堆栈溢出一般是由什么原因导致的?
       堆栈溢出一般是循环的递归调用导致的,如果使用的大数据结构的局部变量,也可能导致堆栈溢出。
        没有回收垃圾资源导致的是内存泄露最后内存耗尽。

7、什么函数不能声明为虚函数?
      构造函数,静态成员函数,非成员函数,部分模板函数。

15、数组a[N],存放了1至N-1个数,其中某个数重复一次。写一个函数,找出被重复的数字.时间复杂度必须为o(N)函数原型:int do_dup(int a[],int N)
#include
int main()
{
 int arr[10]={3,6,1,8,9,2,5,8,4,0};
 int size=sizeof(arr)/sizeof(int);
 int *p=new int[size+1];//加1是因为下标可能达到size
 //memset(p,0,sizeof(arr));
 for(int i=0;i {
        if(p[arr[i]] == -1)
   cout<<"这个值重复了:"<
  p[arr[i]]=-1;
 }
 return 0;
}

1、static全局变量与普通的全局变量有什么区别?

     static局部变量和普通局部变量有什么区别?

     static函数与普通函数有什么区别?

      

     1)、static全局变量只初使化一次,防止在其他文件单元中被引用;全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

     2)、static局部变量只被初始化一次,下一次依据上一次结果值;把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。

     3)、static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件。

4.unsigned int intvert(unsigned int x,int p,int n)实现对x的进行转换,p为起始转化位,n为需要转换的长度,假设起始点在右边.如x=0b0001 0001,p=4,n=3转换后x=0b0110 0001

unsigned int intvert(unsigned int x,int p,int n){
unsigned int _t = 0;
unsigned int _a = 1;
for(int i = 0; i < n; ++i){
_t |= _a;
_a = _a << 1;
}
_t = _t << p;
x ^= _t;
return x;
}

1、(void *)ptr 和 (*(void**))ptr的结果是否相同?其中ptr为同一个指针
     (void *)ptr 和 (*(void**))ptr值是相同的

3、要对绝对地址0x100000赋值,我们可以用:

(unsigned int*)0x100000 = 1234;
那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做?
*((void (*)( ))0x100000 ) ( );
首先要将0x100000强制转换成函数指针,即:
(void (*)())0x100000
然后再调用它:
*((void (*)())0x100000)();
用typedef可以看得更直观些:
typedef void(*)() voidFuncPtr;
*((voidFuncPtr)0x100000)();

5、线程与进程的区别和联系? 线程是否具有相同的堆栈? dll是否有独立的堆栈?
       进程是死的,只是一些资源的集合,真正的程序执行都是线程来完成的,程序启动的时候操作系统就帮你创建了一个主线程。

       每个线程有自己的堆栈。
       DLL中有没有独立的堆栈,这个问题不好回答,或者说这个问题本身是否有问题。因为DLL中的代码是被某些线程所执行,只有线程拥有堆栈,如果DLL中的代码是EXE中的线程所调用,那么这个时候是不是说这个DLL没有自己独立的堆栈?如果DLL中的代码是由DLL自己创建的线程所执行,那么是不是说DLL有独立的堆栈?

       以上讲的是堆栈,如果对于堆来说,每个DLL有自己的堆,所以如果是从DLL中动态分配的内存,最好是从DLL中删除,如果你从DLL中分配内存,然后在EXE中,或者另外一个DLL中删除,很有可能导致程序崩溃。