面试题汇总
2012-04-21 13:54
204 查看
1、字符串翻转
2、const的用法
const的用法主要有:
1)定义常量:const int a = 10;
2)修饰函数参数和返回值:void PreOrderTraverse(const BiTree *tree);
3、const和#define的区别
const和#define均可用作常量的定义,但相比较而言,const较优:
1)const有数据类型,而宏定义是没有的。那么编译器可以对const进行类型安全检查,对#define只进行简单的字符串替换,没有安全类型检查,就可能出现运行时的错误。
2)有些编译工具可以对const常量进行调试,而对#define的宏定义则是简单的替换,不能进行调试。
4、函数指针的定义
5、static的作用
static的主要作用是用来改变作用域:
1)以static申明的全局变量、函数不得被其他文件所引用。
2)在函数内部定义的static限定的变量,在函数结束后还可以继续使用。
3)在类中的static成员变量和函数属于整个类所拥有,不接收this指针,因此只能访问类的static成员变量。
6、volatile限定修饰符
volatile修饰符的主要作用是提示编译器,该对象的值可能在编译器未监测到的情况下被改变。因此编译器不能对volatile修饰的变量进行代码优化处理。
7、计数排序
计数排序法是对一个待排序的数组进行排序,并将排序结果放到另一个新的数组中。计数排序算法针对待排序数组中的每个记录,扫描待排序的数组一趟,统计待排序数组中有多少个记录的值比该记录的值小。假设针对某一个记录,统计出的计数值为n,那么,这个记录在新的有序数组中的合适的存放位置即为n。
8、TCP和UDP的区别
TCP是传输控制协议,提供的是面对连接、可靠的字节流服务。客户端和服务器的通信必须建立一个TCP连接,而且维持这个连接直到数据传输结束或者出现网络错误被迫中断为止。TCP提供超时重发、丢弃重复数据、检验数据、流量控制功能,保证数据的可靠传输。
UDP是用户数据报协议,是面对数据报的传输层协议。UDP不提供可靠的面向连接的服务,它只是把IP层的数据报发送出去,并不保证数据报到达目的地。由于UDP的数据传输不需要建立连接,因此传输速度较TCP快,但是每个数据报都必须包含目的地址,增加了网络负载。
9、Linux GDB高度选项
调用gdb编译需要在cc后面加 -g参数再加-o
#gdb 调试文件: 启动gdb
(gdb) l: (字母l)从第一行开始列出源码
(gdb) break n: 在第n行处设置断点
(gdb) break func: 在函数func()的入口处设置断点
(gdb) info break: 查看断点信息
(gdb) r: 运行程序
(gdb) n: 单步执行
(gdb) c: 继续运行
(gdb) p 变量: 打印变量的值
(gdb) bt: 查看函数堆栈
(gdb) finish: 退出函数
(gdb) shell 命令行: 执行shell命令行
(gdb) set args 参数: 指定运行时的参数
(gdb) show args: 查看设置好的参数
(gdb) show paths: 查看程序运行路径;
set environmentvarname [=value] 设置环境变量。如: setenv USER=hchen;
show environment[varname] 查看环境变量;
(gdb) cd: 相当于shell的cd;
(gdb)pwd: 显示当前所在目录
(gdb)info program: 来查看程序的是否在运行,进程号,被暂停的原因。
(gdb)clear 行号n: 清除第n行的断点
(gdb)delete 断点号n: 删除第n个断点
(gdb)disable 断点号n: 暂停第n个断点
(gdb)enable 断点号n: 开启第n个断点
(gdb)step 单步调试如果有函数调用,则进入函数;与命令n不同,n是不进入调用的函数的
list 简记为 l ,其作用就是列出程序的源代码,默认每次显示10行。
list 行号:将显示当前文件以“行号”为中心的前后10行代码,如:list 12
list 函数名:将显示“函数名”所在函数的源代码,如:listmain
list: 不带参数,将接着上一次 list 命令的,输出下边的内容。
#include <stdio.h> #include <string.h> int main() { int i = 0, j = 0, len; char str[10], res[10]; scanf("%s", str); len = strlen(str); for(i = len - 1; i >= 0; i--) { res[j] = str[i]; j++; } res[j] = '\0'; printf("%s\n", res); return 0; }
2、const的用法
const的用法主要有:
1)定义常量:const int a = 10;
2)修饰函数参数和返回值:void PreOrderTraverse(const BiTree *tree);
3、const和#define的区别
const和#define均可用作常量的定义,但相比较而言,const较优:
1)const有数据类型,而宏定义是没有的。那么编译器可以对const进行类型安全检查,对#define只进行简单的字符串替换,没有安全类型检查,就可能出现运行时的错误。
2)有些编译工具可以对const常量进行调试,而对#define的宏定义则是简单的替换,不能进行调试。
4、函数指针的定义
#include <stdio.h> int max(int a, int b) { return a > b ? a : b; } int main() { int (*fun)(); int a = 3, b = 2; fun = &max; printf("%d\n", fun(a, b)); return 0; }
5、static的作用
static的主要作用是用来改变作用域:
1)以static申明的全局变量、函数不得被其他文件所引用。
2)在函数内部定义的static限定的变量,在函数结束后还可以继续使用。
3)在类中的static成员变量和函数属于整个类所拥有,不接收this指针,因此只能访问类的static成员变量。
6、volatile限定修饰符
volatile修饰符的主要作用是提示编译器,该对象的值可能在编译器未监测到的情况下被改变。因此编译器不能对volatile修饰的变量进行代码优化处理。
7、计数排序
计数排序法是对一个待排序的数组进行排序,并将排序结果放到另一个新的数组中。计数排序算法针对待排序数组中的每个记录,扫描待排序的数组一趟,统计待排序数组中有多少个记录的值比该记录的值小。假设针对某一个记录,统计出的计数值为n,那么,这个记录在新的有序数组中的合适的存放位置即为n。
/* * 功能:计数排序 */ #include <iostream> using namespace std; //找出数组中最大值 int max(int *array,int length) { int maxNum=array[0]; for(int i=1;i<length;i++) { if(array[i]>maxNum) maxNum=array[i]; } return maxNum; } //对元素值介于0~maxNum之间的数组进行计数排序 //算法思路:计算数组中小于某个元素的元素个数计为i,那么该元素在排好序的结果中的位置即为i+1 int *CountingSort(int *array,int length) { int maxNum=max(array,length)+1; //数组cArray为计数数组,数组大小为maxNum+1 //记录数组中每个元素在该数组中出现的次数 //因此数组大小应为数组中最大元素加1(考虑数组中可能包含0值) int *cArray=new int[maxNum]; //数组bArray为结果数组 int *bArray=new int[length]; //计数数组初始化 for(int i=0;i<maxNum;i++) { cArray[i]=0; } //对要排序的数组进行遍历,记录数组中每个元素在该数组中出现的次数 for(int j=0;j<length;j++) { //cArray[i]包含等于i的元素个数 cArray[array[j]]++; } //遍历数组cArray,得到数组中小于等于ele(0≤ele≤maxNum)的元素个数,并存入cArray[ele]中 for(i=1;i<maxNum;i++) { //cArray[i]包含小于或等于i的元素个数 cArray[i]=cArray[i]+cArray[i-1]; } //从数组最后一个元素开始遍历,将array[j]放到正确位置 //之所以要从数组最后一个元素开始遍历是为了保证排序算法是稳定的 for(j=length-1;j>=0;j--) { //由cArray[array[j]]得到元素array[j]在结果集中是第几个元素,并将其放入bArray结果数组中 bArray[cArray[array[j]]-1]=array[j]; //考虑到待排序数组中存在值相同的元素,所以每当将一个值array[j]放入bArray中时 //都要减小cArray[array[j]]的值 cArray[array[j]]--; } //返回结果数组 return bArray; } int main() { int array[]={10,9,8,7,6,5,4,3,2,1,0}; int *bArray=CountingSort(array,sizeof(array)/sizeof(*array)); for(int j=0;j<sizeof(array)/sizeof(*array);j++) { cout<<bArray[j]<<endl; } return 0; }
8、TCP和UDP的区别
TCP是传输控制协议,提供的是面对连接、可靠的字节流服务。客户端和服务器的通信必须建立一个TCP连接,而且维持这个连接直到数据传输结束或者出现网络错误被迫中断为止。TCP提供超时重发、丢弃重复数据、检验数据、流量控制功能,保证数据的可靠传输。
UDP是用户数据报协议,是面对数据报的传输层协议。UDP不提供可靠的面向连接的服务,它只是把IP层的数据报发送出去,并不保证数据报到达目的地。由于UDP的数据传输不需要建立连接,因此传输速度较TCP快,但是每个数据报都必须包含目的地址,增加了网络负载。
9、Linux GDB高度选项
调用gdb编译需要在cc后面加 -g参数再加-o
#gdb 调试文件: 启动gdb
(gdb) l: (字母l)从第一行开始列出源码
(gdb) break n: 在第n行处设置断点
(gdb) break func: 在函数func()的入口处设置断点
(gdb) info break: 查看断点信息
(gdb) r: 运行程序
(gdb) n: 单步执行
(gdb) c: 继续运行
(gdb) p 变量: 打印变量的值
(gdb) bt: 查看函数堆栈
(gdb) finish: 退出函数
(gdb) shell 命令行: 执行shell命令行
(gdb) set args 参数: 指定运行时的参数
(gdb) show args: 查看设置好的参数
(gdb) show paths: 查看程序运行路径;
set environmentvarname [=value] 设置环境变量。如: setenv USER=hchen;
show environment[varname] 查看环境变量;
(gdb) cd: 相当于shell的cd;
(gdb)pwd: 显示当前所在目录
(gdb)info program: 来查看程序的是否在运行,进程号,被暂停的原因。
(gdb)clear 行号n: 清除第n行的断点
(gdb)delete 断点号n: 删除第n个断点
(gdb)disable 断点号n: 暂停第n个断点
(gdb)enable 断点号n: 开启第n个断点
(gdb)step 单步调试如果有函数调用,则进入函数;与命令n不同,n是不进入调用的函数的
list 简记为 l ,其作用就是列出程序的源代码,默认每次显示10行。
list 行号:将显示当前文件以“行号”为中心的前后10行代码,如:list 12
list 函数名:将显示“函数名”所在函数的源代码,如:listmain
list: 不带参数,将接着上一次 list 命令的,输出下边的内容。