C面试题:单线程与多线程的问题?面试题c语言:
本文目录
- C面试题:单线程与多线程的问题
- 面试题c语言:
- c++经典面试题及答案
- c语言面试题关于字符串,还有字符指针
- 一道C语言面试题printf输出问题,高手们都来看看吧
- C语言面试题
- c语言经典面试题
- 面试题:C语言用十种方法实现hello world程序,怎么做
C面试题:单线程与多线程的问题
不是,前提是你又足够的空间或者速度。比如说一条路,很多车要过,要是路很宽的话,当时是很多车一起过才效率高了,但是要是路很窄的话,那肯定是不能很多车一起过的了。就好想现在还在研究超级电脑,大型的那种数据系统,普通的电脑就是单线程来处理也不够用啊!
面试题c语言:
用归并排序算法://---------------------------------------------------------------------------#include 《stdio.h》int main(void){ int a={2,4,6,8,10}; /*合并后的数组保存到a中*/ int c,i=0,j=0,k=0; while (i《5&&j《5) /*合并两个有序数组,并将结果保存到临时数组c中*/ if (a) { c; } else c; while (i《5) c; while (j《5) c; for (i = 0; i《k; i++) { /*将合并后的位置临时数组中的元素复制到a数组并输出。*/ a; printf("%d ",a); } return 0;}//---------------------------------------------------------------------------
c++经典面试题及答案
1. C++的类和C里面的struct有什么区别?
struct成员默认访问权限为public,而class成员默认访问权限为private
2. 析构函数和虚函数的用法和作用
析构函数是在对象生存期结束时自动调用的函数,用来释放在构造函数分配的内存。
虚函数是指被关键字virtual说明的函数,作用是使用C++语言的多态特性
3. 全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?
1) 全局变量的作用用这个程序块,而局部变量作用于当前函数
2) 前者在内存中分配在全局数据区,后者分配在栈区
3) 生命周期不同:全局变量随主程序创建和创建,随主程序销毁而销毁,局部变量在局部函数内部,甚至局部循环体等内部存在,退出就不存在
4) 使用方式不同:通过声明后全局变量程序的各个部分都可以用到,局部变量只能在局部使用
4. 有N个大小不等的自然数(1–N),请将它们由小到大排序.要求程序算法:时间复杂度为O(n),空间复杂度为O(1)。
void sort(int e, int n)
{
int i;
int t;
for (i=1; i {
t = e;
e;
e = t;
}
}
5. 堆与栈的去区别
A. 申请方式不同
Stack由系统自动分配,而heap需要程序员自己申请,并指明大小。
B. 申请后系统的响应不同
Stack:只要栈的剩余空间大于申请空间,系统就为程序提供内存,否则将抛出栈溢出异常
Heap:当系统收到程序申请时,先遍历操作系统中记录空闲内存地址的链表,寻找第一个大于所申请空间的堆结点,然后将该结点从空间结点链表中删 除,并将该结点的空间分配给程序。另外,大多数系统还会在这块内存空间中的首地址处记录本次分配的大小,以便于delete语句正确释放空间。而且,由于 找到的堆结点的大小不一定正好等于申请的大小,系统会自动将多余的那部分重新放入空闲链表。
C. 申请大小限制的不同
Stack:在windows下,栈的大小是2M(也可能是1M它是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
Heap:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
D. 申请效率的比较:
栈由系统自动分配,速度较快。但程序员是无法控制的。
堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。
另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活。
E. 堆和栈中的存储内容
栈:在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器 中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开 始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。
堆:一般是在堆的.头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。
6. 含参数的宏与函数的优缺点
宏: 优点:在预处理阶段完成,不占用编译时间,同时,省去了函数调用的开销,运行效率高
缺点:不进行类型检查,多次宏替换会导致代码体积变大,而且由于宏本质上是字符串替换,故可能会由于一些参数的副作用导致得出错误的结果。
函数: 优点:没有带参数宏可能导致的副作用,进行类型检查,计算的正确性更有保证。
缺点:函数调用需要参数、返回地址等的入栈、出栈开销,效率没有带参数宏高
PS:宏与内联函数的区别
内联函数和宏都是在程序出现的地方展开,内联函数不是通过函数调用实现的,是在调用该函数的程序处将它展开(在编译期间完成的);宏同样是;
不同的是:内联函数可以在编译期间完成诸如类型检测,语句是否正确等编译功能;宏就不具有这样的功能,而且宏展开的时间和内联函数也是不同的(在运行期间展开)
7. Windows程序的入口是哪里?写出Windows消息机制的流程
Windows程序的入口是WinMain()函数。
Windows应用程序消息处理机制:
A. 操作系统接收应用程序的窗口消息,将消息投递到该应用程序的消息队列中
B. 应用程序在消息循环中调用GetMessage函数从消息队列中取出一条一条的消息,取出消息后,应用程序可以对消息进行一些预处理。
C. 应用程序调用DispatchMessage,将消息回传给操作系统。
D. 系统利用WNDCLASS结构体的lpfnWndProc成员保存的窗口过程函数的指针调用窗口过程,对消息进行处理。
8. 如何定义和实现一个类的成员函数为回调函数
A.什么是回调函数?
简而言之,回调函数就是被调用者回头调用调用者的函数。
使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个被调用函数。而该被调用函数在需要的时候,利用传递的地址调用回调函数。
回调函数,就是由你自己写的,你需要调用另外一个函数,而这个函数的其中一个参数,就是你的这个回调函数名。这样,系统在必要的时候,就会调用你写的回调函数,这样你就可以在回调函数里完成你要做的事。
B.如何定义和实现一个类的成员函数为回调函数
要定义和实现一个类的成员函数为回调函数需要做三件事:
a.声明;
b.定义;
c.设置触发条件,就是在你的函数中把你的回调函数名作为一个参数,以便系统调用
如:
一、声明回调函数类型
typedef void (*FunPtr)(void);
二、定义回调函数
class A
{
public:
A();
static void callBackFun(void) //回调函数,必须声明为static
{
cout《《"callBackFun"《
}
virtual ~A();
};
三、设置触发条件
void Funtype(FunPtr p)
{
p();
}
void main(void)
{
Funtype(A::callBackFun);
}
C. 回调函数与API函数
回调和API非常接近,他们的共性都是跨层调用的函数。但区别是API是低层提供给高层的调用,一般这个函数对高层都是已知的;而回调正好相反, 他是高层提供给底层的调用,对于低层他是未知的,必须由高层进行安装,这个安装函数其实就是一个低层提供的API,安装后低层不知道这个回调的名字,但它 通过一个函数指针来保存这个回调函数,在需要调用时,只需引用这个函数指针和相关的参数指针。
其实:回调就是该函数写在高层,低层通过一个函数指针保存这个函数,在某个事件的触发下,低层通过该函数指针调用高层那个函数。
c语言面试题关于字符串,还有字符指针
str是个字符指针,也可以表示为字符数组或者字符串,str = &a;表示str指向的地方只能存下一个字符。
strcpy(str, “hello”);
肯定放不下hello啊,所以会有内存错误
如果你不相信,你把hello换成空串""试试,因为空串占用1字节,str指向的地方能放下。
如果你想知道更多,那么试试下面的这段程序:
#include 《stdio.h》#include 《string.h》void main(void) { int a; char *str = (char *) &a; strcpy(str, "abc"); printf(str);}
这段之所可以是因为int类型占4个字节,"abc"也占4个,能放下,"abcd"就不行。
懂了吗?
一道C语言面试题printf输出问题,高手们都来看看吧
C语言的计算规则是由右到左,先计算右,再计算左,所以根据语句上面看c=(c+b)=20+30=50;b=(c*2)=20*5=100;a+b+c=10+100+50=160;
从右向左计算c = c+b = 30+20 = 50b= c*2 = 50*2 = 100a+b+c = 10+100+50 = 160输出160 100 50
C语言面试题
照你的程序,两个函数指针类型的定义会编译出错,应改成:typedef int(*FUNC1) (int in);typedef int(*FUNC2) (int*,int*,int*);输出为:110n
#include《stdio.h》typedef int(*FUNC1) (int in);typedef int(*FUNC2) (int*,int*,int*);int inc(int a){return(++a);}int multi(int*a,int*b,int*c){return(*c=*a**b);}void show(FUNC2 fun,int arg1,int*arg2){FUNC1 p=&incint temp=p(arg1);fun(&temp,&arg1,arg2);printf("%d",*arg2);}main(){int a;//局部变量a为0;show(multi,10,&a);printf("\n");return 0;}这样就能编译过去了
c语言经典面试题
CString SaveLog(char *fmt ,...){ va_list marker; va_start( marker, fmt ); char buf = {0}; vsprintf(buf,fmt,marker); va_end( marker ); CString sLog; sLog.Format("%s\n", tNow.Format(""), buf); return sLog;}调用:SaveLog( "%s %s %s.", strFileName, sFound, strVirus, sKilledEng);给你个例子吧。不过这个例子是VC的,不知道C下面能不能跑
面试题:C语言用十种方法实现hello world程序,怎么做
1 最经典的“Hello world!”,直接用 printf 输出 “Hello world!”#include 《stdio.h》#include 《iostream》 int main(){printf("Hello world! "); // 教科书的写法puts("Hello world!"); // 我最喜欢的puts("Hello" " " "world!"); // 拼接字符串std::cout 《《 "Hello world!" 《《 std::endl; // C++风格的教科书写法 return 0;}2、用宏写的“Hello world!”“#”可以“提取”参数的名 字,把它变成字符串。#include 《stdio.h》 #define Say(sth) puts (#sth) int main(){return Say(Hello world!);}3. 断章取义的“Hello world!”#include 《stdio.h》 int main(){return puts ("Do not say: Hello world! ");}4. 退出时运行的“Hello world!”atexit()注册回调函数。这个函数可以调用多次,最后注册的函数最先执行。#include 《stdio.h》#include 《stdlib.h》void say(){printf("world! ");}void sth(){printf("Hello ");}int main(){return atexit(say), atexit (sth);}5. 读取自己的“Hello world!”// Hello world!#include 《iostream》#include 《fstream》#include 《string》int main(){std::ifstream ifs(__FILE__);std::string say, some, word; ifs 》》 say 》》 some 》》 word;std::cout 《《 some 《《 " " 《《 word; return 0;}6. 话分两头的“Hello world!”声明一个全局的类的实例,在 main 函数执行之前会调用这个类的构造函数,结束之后则会调用析构函数。#include 《iostream》 class say{public:say(){std::cout 《《 "Hell";} ~say(){std::cout 《《 "world!";}}hello; int main(){std::cout 《《 "o ";return 0;} 7. 传入模板的“Hello world!”#include 《iostream》 template 《char * words》class say{public:void operator () (){std::cout 《《 words;}};char hello = "Hello world!";int main(){return say《hello》()(), 0;}8. 调用私有函数的“Hello world!”#include 《iostream》#include 《cstddef》class secret{private:virtual void say(){std::cout 《《 "Hello world!";}};int main(){secret word;(reinterpret_cast《void (*)()》(**(intptr_t**)(&word)))();return 0;} 9. 直接修改函数的返回地址#include 《stdio.h》#include 《stdlib.h》#include 《stddef.h》 void say(){puts("Hello world!");exit(0);}int main(){volatile intptr_t a = 0;volatile intptr_t * p = &a *(p + 2) = (intptr_t)say;*(p + 3) = (intptr_t)say; return 0;} 10. 外星人说的“Hello world!”#include 《stdio.h》 void alien_say (char * p){while (putchar (*(p += *(p + 1) - *p)));} int main(){return alien_say ("BETHO! Altec oh liryom(a loadjudas!) dowd."), 0;}
更多文章:
华为荣耀g700(华为g700-t00移动版最多能拓展多少内存)
2023年12月21日 01:40
诺基亚925可以插内存卡吗(我想买一个诺基亚925,请问它用的小卡是几寸的)
2024年7月9日 11:15
华为p30pro怎么样把性能最大化(华为p30pro怎么设置手机运行快)
2024年6月24日 17:15
手机导购可以坐着吗(商场化妆品导购 一直站着吗不能坐吗 是不是太累了)
2024年6月28日 02:45
联想笔记本重装系统按哪个键(电脑重装系统时一个重新启动的快捷键是什么)
2024年7月13日 05:01
a5160三星参数(三星A5160支持卡2安装手机卡和内存卡排线同时使用吗)
2024年6月11日 02:25
vivox60曲面屏手机壳(vivox60tpro+与vivox60pro+手机壳通用吗)
2024年7月22日 18:28
联想k900能不能root(我手机是联想k900的,要怎么才可以给叉叉root权限啊)
2024年11月7日 08:15
vivo x6plus刷机包(vivo x6plusD刷机以后,有账户密码,但是忘了,现在手机也进不去了,怎么办哇)
2024年10月31日 21:45