介绍几个H3C 2013年实习生的面试题
1,宏和内联函数的区别
宏定义:
宏是在预处理阶段进行的简单的字符串替换(注意是字符串的替换,不是其他类型参数的替换)。而且对参数不进行任何检查的验证检查。宏的参数是不占内存空间的,因为只是做字符串的替换。
内联函数:
所谓"内联函数"就是将很简单的函数"内嵌"到调用他的程序代码中,目的旨在节约下原本函数调用时的时空开销。但必须注意的是,作为内联函数,函数体必须十分简单,不能含有循环、条件、选择等复杂的结构,否则就不能做为内联函数了。事实上,即便你没有指定函数为内联函数,有的编译系统也会自动将很简单的函数作为内联函数处理;而对于复杂的函数,即便你指定他为内联函数,系统也不会理会的。
2,堆和栈的区别
这个问题我在前面的一篇博文中已经进行了详细的介绍。请看C中进程的内存分配
3,C++中using namespace std 的作用
对于一个存在着标准输入输出的C++控制台程序,一般会在#include <iostream>的下一行发现一句话,using namespace std。这句话其实就表示了所有的标准库函数都在标准命名空间std中进行了定义。其作用就在于避免发生重命名的问题。
关于using namespace *
顾名思义,using namespace * 就表示释放命名空间* 中间的东西。好处在于我们在程序里面就不用在每个函数的头上都加上*::来调用。如果我们不加上using namespace std,那么我们就需要在主函数中的标准输出流cout函数前面加上std,写成std::cout.表示调用std空间里面的标准输出流cout。
4,解释说明main函数参数
int main(int argc, char *argv[])
这两个参数的作用:argc 是指命令行输入参数的个数(以空白符分隔),argv存储了所有的命令行参数 假如你的程序是hello.exe,如果在命令行运行该程序,运行命令为:hello.exe USTC SZ
那么,argc的值是 3,argv[0]是"hello.exe",argv[1]是"USTC",argv[2]是"SZ"。下面的程序演示argc和argv的使用:
#include <stdio.h> int main(int argc, char ** argv) { int i; for (i=0; i < argc; i++) printf("Argument %d is %s.\n", i, argv[i]); return 0; }
假如上述代码编译为hello.exe,那么运行
hello.exe a b c d e
将得到
Argument 0 is hello.exe.
Argument 1 is a.
Argument 2 is b.
Argument 3 is c.
Argument 4 is d.
Argument 5 is e.
运行
hello.exe lena.jpg
将得到
Argument 0 is hello.exe.
Argument 1 is lena.jpg.
5,进程和线程的区别
这个问题请看我的前面的一篇文章进程与线程的一个简单解释
6,单链表的逆置
ListNode* ReverseList(ListNode* pHead) { ListNode* pReversedHead = NULL; ListNode* pNode = pHead; ListNode* pPrev = NULL; while(pNode != NULL) { ListNode* pNext = pNode->m_pNext; if(pNext == NULL) pReversedHead = pNode; pNode->m_pNext = pPrev; pPrev = pNode; pNode = pNext; } return pReversedHead; }