C语言面试题.pdf
关于c的面试题目(3篇)

第1篇一、基础知识点1. 请简述C语言的发展历程。
C语言是由美国贝尔实验室的Dennis Ritchie在1972年发明的,它是一种高级程序设计语言,具有丰富的数据类型和运算符,广泛应用于系统软件、应用软件和嵌入式系统等领域。
C语言的发展历程大致可以分为以下几个阶段:(1)1972年:Dennis Ritchie开始设计C语言。
(2)1973年:C语言的第一个版本0.1发布。
(3)1975年:C语言的第一个正式版本C1发布。
(4)1978年:Brian Kernighan和Dennis Ritchie合著的《C程序设计语言》出版,使得C语言迅速流行。
(5)1983年:C语言的国际标准化组织(ISO)开始制定C语言标准,即C89标准。
(6)1990年:C语言的国际标准化组织发布了C90标准。
(7)2000年:C语言的国际标准化组织发布了C99标准。
2. 请简述C语言的特点。
C语言具有以下特点:(1)简洁、高效:C语言语法简单,执行效率高。
(2)跨平台:C语言编写的程序可以在不同的操作系统和硬件平台上运行。
(3)丰富的库函数:C语言提供了丰富的标准库函数,方便程序员进行编程。
(4)可移植性:C语言编写的程序具有较好的可移植性,可以在不同的环境下编译和运行。
(5)模块化:C语言支持模块化编程,便于代码的重用和维护。
3. 请简述C语言的数据类型。
C语言的数据类型分为以下几类:(1)基本数据类型:int、float、double、char等。
(2)枚举类型:enum。
(3)结构体类型:struct。
(4)联合体类型:union。
(5)指针类型:void。
(6)数组类型:数组是具有相同数据类型元素集合的实体。
4. 请简述C语言的基本语法。
C语言的基本语法包括:(1)标识符:标识符用于命名变量、函数、数组等。
(2)关键字:关键字是C语言中预定义的具有特殊含义的单词。
(3)运算符:C语言提供了丰富的运算符,包括算术运算符、关系运算符、逻辑运算符等。
c面试试题及答案

c面试试题及答案一、自我介绍你好,我是XXX,很高兴有机会参加C面试。
我具备扎实的编程基础和丰富的项目经验,在此次面试中,我将展示我的能力和潜力。
谢谢!二、C语言基础知识1. 请解释C语言中的指针(pointer)是什么?指针是一种变量,它存储了内存地址。
通过指针,我们可以直接访问和修改内存中的数据。
指针的灵活性使得我们可以在C语言中进行高效的内存管理和操作。
2. 请描述C语言中的动态内存分配的过程及对应的函数。
动态内存分配是在程序运行时按需分配和释放内存的过程。
在C语言中,使用malloc函数动态分配内存,使用free函数释放已分配的内存。
具体分配内存的大小和释放内存的时机需要根据具体需求来决定。
3. 什么是结构体(struct)?如何定义和使用结构体?结构体是一种自定义的数据类型,它可以将不同类型的数据按照一定的组织方式打包在一起。
在C语言中,我们可以使用struct关键字定义结构体,并通过点操作符(.)来访问结构体成员。
4. C语言中的位运算符有哪些,分别用于什么场景?C语言中常用的位运算符有按位与(&)、按位或(|)、按位异或(^),它们用于对二进制数进行位级操作。
位运算可以在一些特定场景中提高程序的运行效率,如位掩码、位标记等。
三、编程题请编写一个C语言程序,实现冒泡排序算法。
```c#include <stdio.h>void bubbleSort(int arr[], int size) {int i, j, temp;for (i = 0; i < size - 1; i++) {for (j = 0; j < size - i - 1; j++) {if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}int main() {int arr[] = {5, 2, 9, 3, 7};int size = sizeof(arr) / sizeof(arr[0]);bubbleSort(arr, size);printf("排序结果:");for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}return 0;}```这个程序实现了冒泡排序算法,将数组中的元素按照升序排列,并输出排序结果。
C语言面试题(深度)

#include <stdio.h> void func(char a[10]) {
char c = a[3]; } int main() {
char b[10] = "abcdefg"; func(b[10]); return 0; }
/* * 这里至少有两上严重错误, * 第一,b[10]并不存在,在编译的时候,由于没有去实际地址取值,所以没 有出错。但在运行的时, * 将计算b[10]的实际地址,并且取值。这时候发生越界错误。 * 第二, * warning: * passing argument 1 of 'func' makes pointer from integer without a cast *这是func函数会将传入的char类型的数据当作地址处理,同样会发生错误 。 */
2 下面代码有问题么?为什么?(segment error, 读越界,写越界)
#include <stdio.h> #include <string.h> void foo(void) {
char string[10],str1[10]; int i; for(i=0; i<10; i++) {
str1[i] = 'a'; } strcpy(string,str1); printf("%s",string); } int main() { foo(); return 0; }
代码 2 ,volatile 关键字告诉编译器,i 是随时可能发生的变化的,每次使用 它的时候,必须从内存中取出 i 的值。因而编译器生成的汇编代码会重新从 i 的地址处 读取数据放在 k 中。
c与c_面试题目(3篇)

第1篇第一部分:C语言基础1. 面试题:请解释C语言中的“变量声明”和“变量定义”的区别。
解析:- 变量声明:告诉编译器即将使用一个变量,但不分配存储空间。
它只告诉编译器变量的名称、数据类型和存储类别。
- 变量定义:不仅告诉编译器变量的名称、数据类型和存储类别,还分配存储空间给变量。
```cint i; // 变量声明int i = 10; // 变量定义```2. 面试题:什么是内存泄漏?如何检测和避免内存泄漏?解析:- 内存泄漏:在程序运行过程中,由于疏忽或错误,导致已分配的内存没有被释放,导致内存占用逐渐增加,最终可能耗尽系统内存。
- 检测内存泄漏:可以使用工具如Valgrind、Sanitizer等来检测内存泄漏。
- 避免内存泄漏:- 确保所有分配的内存在使用后都被释放。
- 使用智能指针(如C++中的`std::unique_ptr`、`std::shared_ptr`)来自动管理内存。
```cvoid function() {int ptr = malloc(sizeof(int)); // 分配内存// 使用ptr...free(ptr); // 释放内存}```3. 面试题:请解释C语言中的指针和数组的关系。
解析:- 在C语言中,数组名本身就是一个指向数组首元素的指针。
- 可以通过指针访问数组元素,也可以通过数组下标访问。
```cint arr[10];int ptr = arr; // ptr指向数组的第一个元素int value = (ptr + 5); // 访问数组中索引为5的元素```4. 面试题:请解释C语言中的结构体(struct)和联合体(union)的区别。
解析:- 结构体:可以包含不同数据类型的成员,每个成员都有自己的内存空间。
- 联合体:所有成员共享同一块内存空间,在某一时刻只有一个成员有效。
```cstruct {int a;float b;} s;union {int a;float b;} u;```第二部分:C++基础1. 面试题:请解释C++中的构造函数和析构函数。
c的面试题及答案

c的面试题及答案面试题一:请解释一下C语言的指针和引用的区别。
答案:在C语言中,指针和引用都是用来处理内存地址的。
它们的主要区别在于以下几个方面:1. 定义和使用方式:- 指针是一个变量,存储的是一个内存地址。
通过使用"*"操作符可以获取或修改该地址对应的值。
- 引用则是一个已存在对象的别名。
它在定义时需要和原对象进行绑定,并且无法更改绑定的对象。
2. 空指针和无效引用:- 指针可以被赋值为空指针(NULL)或无效的地址值,表示指针不指向任何有效的内存地址。
- 引用必须在定义时进行初始化,并且必须引用一个有效的对象。
3. 内存管理:- 指针需要显式地通过动态内存分配函数(如malloc())进行内存的分配和释放。
- 引用的内存管理则由编译器自动处理,无需手动管理。
4. 数组和函数的传递:- 指针可以用于处理数组或者作为函数的参数进行传递。
- 引用可以作为函数参数,但无法直接用于处理数组。
面试题二:请解释C语言中的堆和栈的区别。
答案:在C语言中,堆和栈是两种不同的内存分配方式,具有以下区别:1. 分配方式:- 栈是由编译器自动分配和释放的,它的空间有限,大小在编译时就已经确定。
- 堆是由程序员手动分配和释放的,它的空间相比栈更大,并且大小在运行时可动态调整。
2. 内存结构:- 栈的数据结构为“先进后出”的方式,即后进栈的数据先出栈。
- 堆则没有明确的数据结构,按照动态分配顺序分配内存。
3. 分配效率:- 栈的分配和释放速度要快于堆,因为栈只需要移动栈顶指针即可。
- 堆的分配和释放速度相对较慢,因为需要在运行时进行内存的动态分配和回收。
4. 使用方式:- 栈主要用于存储局部变量、函数调用和函数参数等数据。
- 堆主要用于存储动态分配的内存,如通过malloc()函数分配的内存块。
面试题三:请解释C语言中的宏定义和常量的区别。
答案:在C语言中,宏定义和常量都可以用来表示不可更改的值,但它们的区别如下:1. 定义方式:- 宏定义使用“#define”关键字进行定义,没有数据类型限制。
c语言面试题目100及最佳答案精选全文

精选全文完整版(可编辑修改)c语言面试题目及最佳答案1、描述⼀下gcc的编译过程?gcc编译过程分为4个阶段:预处理、编译、汇编、链接。
预处理:头⼀件包含、宏替换、条件编译、删除注释编译:主要进⼀词法、语法、语义分析等,检查⼀误后将预处理好的⼀件编译成汇编⼀件。
汇编:将汇编⼀件转换成⼀进制⼀标⼀件链接:将项⼀中的各个⼀进制⼀件+所需的库+启动代码链接成可执⼀⼀件2、内存的最⼀存储单位以及内存的最⼀计量单位分别是?内存的最⼀存储单位为⼀进制位,内存的最⼀计量单位字节3、#include<> 与#include ""的区别?include<>到系统指定⼀录寻找头⼀件,#include ""先到项⼀所在⼀录寻找头⼀件,如果没有找再到系统指定的⼀录下寻找4、描述⼀下变量的命名规则变量名有字⼀、数值、下划线组成,但不能以数值开头5、变量的声明与定义有啥区别?声明变量不需要建⼀存储空间,变量的定义需要建⼀存储空间6、谈谈c语⼀中有符号和⼀符号的区别?有符号:数据的最⼀位为符号位,0表示正数,1表示负数⼀符号:数据的最⼀位不是符号位,⼀是数据的⼀部分7、谈谈计算机中补码的意义统⼀了零的编码将符号位与其他位统⼀处理将减法运算转换成加法运算8、谈谈数组的特点同⼀个数组所有的成员都是相同的数据类型,同时所有的成员在内存中的地址是连续的9、数组的分类数组的分类主要是:静态数组、动态数组两类。
静态数组:类似int arr[5];在程序运⼀就确定了数组的⼀⼀,运⼀过程不能更改数组的⼀⼀。
动态数组:主要是在堆区申请的空间,数组的⼀⼀是在程序运⼀过程中确定,可以更改数组的⼀⼀。
10、描述⼀下⼀维数组的不初始化、部分初始化、完全初始化的不同点不初始化:如果是局部数组数组元素的内容随机如果是全局数组,数组的元素内容为0 部分初始化:未被初始化的部分⼀动补0完全初始化:如果⼀个数组全部初始化可以省略元素的个数数组的⼀⼀由初始化的个数确定11、谈谈数组名作为类型、作为地址、对数组名取地址的区别?数组名作为类型:代表的是整个数组的⼀⼀数组名作为地址:代表的是数组⼀元素的地址对数组名取地址:代表的是数组的⼀地址12、谈谈你对⼀维数组在物理上以及逻辑上的数组维度理解⼀维数组在逻辑上是⼀维的,在物理上是⼀维的13、描述⼀下函数的定义与函数的声明的区别函数定义:是指对函数功能的确⼀,包括指定函数名、函数类型、形参及其类型、函数体等,它是⼀个完整的、独⼀的函数单位。
C语言面试题大汇总,个人觉得还是比较全.pdf

4. static有什么用途(请至少说明两种)1.限制变量的作用域2.设置变量的存储域7. 引用与指针有什么区别?1) 引用必须被初始化,指针不必。
2) 引用初始化以后不能被改变,指针可以改变所指的对象。
2) 不存在指向空值的引用,但是存在指向空值的指针。
8. 描述实时系统的基本特性在特定时间内完成特定的任务,实时性与可靠性9. 全局变量和局部变量在内存中是否有区别如果有,是什么区别?全局变量储存在静态数据库,局部变量在堆栈10. 什么是平衡二叉树?左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于 1 11. 堆栈溢出一般是由什么原因导致的?没有回收垃圾资源12. 什么函数不能声明为虚函数?constructor13. 冒泡排序算法的时间复杂度是什么?O(n^2)14. 写出float x 与“零值”比较的if语句。
if(x>&&x<16. Internet采用哪种网络协议该协议的主要层次结构?tcp/ip 应用层/传输层/网络层/数据链路层/物理层17. Internet物理地址和IP地址转换采用什么协议?ARP (Address Resolution Protocol)(地址解析协议)地址的编码分为哪俩部分?IP地址由两部分组成,网络号和主机号。
不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。
2.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。
写出C程序。
循环链表,用取余操作做3.不能做switch()的参数类型是:switch的参数不能为实型。
华为1、局部变量能否和全局变量重名?答:能,局部会屏蔽全局。
要用全局变量,需要使用"::"局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。
对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内2、如何引用一个已经定义过的全局变量?答:extern可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用ex tern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错3、全局变量可不可以定义在可被多个.C文件包含的头文件中为什么?。
C_C语言笔试面试题目含答案

C语言试题一:单项选择题1.void Example(char acHello[]){printf("%d", sizeof(acHello));return;}void main(){char acHello[] = "hello";Example(acHello);return;}的输出是( )A 4B 5C 6 D不确定2.网络上传输的字节序默认是大字节的,如果主机是小字节序,在网络通信时则须进行字节序转换;如果主机是大字节序,为了程序的一致性及可移植性,最好也在程序中加上字节序转换的操作(空操作)。
( )A. 正确B.错误3. int *(*ptr)();则以下叙述中正确的是( )A) ptr是指向一维组数的指针变量B) ptr是指向int型数据的指针变量C) ptr是指向函数的指针,该函数返回一个int型数据D) ptr是指向函数的指针,该函数的返回值是指向int型数据的指针4.此函数实现把32位IP地址(网络序)以字符串的方式打印出来:char *IpAddr2Str(unsigned long ulIpAddr){char szIpAddr[32];unsigned long ulLocIpAddr = ntohl(ulIpAddr);//把网络序转话为主机序(void)VOS_sprintf(szIpAddr, "%d.%d.%d.%d", ulLocIpAddr >> 24,(ulLocIpAddr >> 16) & 0xff, (ulLocIpAddr >> 8) & 0xff, ulLocIpAddr & 0xff);return szIpAddr;}下面描述正确的是():A、数组szIpAddr空间不够;B、函数返回局部数组szIpAddr变量地址;C、输出的IP地址次序颠倒;5.#define OK 0#define ERR 1#define ERROR (-1)#define BUFFER_SIZE 256char *GetMemory(unsigned long ulSize){char *pcBuf = NULL;pcBuf = (char *)malloc(ulSize);if(NULL == pcBuf){return ERROR;}return pcBuf;}void Test(void){char *pszBuf = NULL;pszBuf = GetMemory(BUFFER_SIZE);if(NULL != pszBuf){strcpy(pszBuf, "Hello World!\r\n");printf(pszBuf);free(pszBuf);}return;}如下描述正确的是:A、pszBuf指向的内存不能超过255B、GetMemory函数的异常分支返回了-1,是一个非法地址C、GetMemory中异常分支没有释放空间;D、pcBuf为局部指针,指向的内存将在GetMemory被调用后释放6、#include "stdio.h"unsigned short *Sum(unsigned char a, unsigned char b){unsigned short s = 0;s = a + b;return &s;}int main(){unsigned short *p = NULL;unsigned char a = 1, b = 2;p = Sum(a, b);printf("%u+%u", a, b);printf("=%u\n", *p);return 0;}程序执行结果是()A.1+2=0B.1+2=3C.1+2=NULLD.不可预测7、设有如下定义:BOOL gStatusA = FALSE;BOOL gStatusB = TRUE;int gVarA = 100;int gVarB = 100;则执行main函数后gVarA和gVarB的值分别为( )BOOL CheckA(){if(gStatusA){gVarA++;}else{gVarA--;}return gStatusA;}BOOL CheckB(){if(gStatusB){gVarB++;}else{gVarB--;}return gStatusB;}int main(int argc, char* argv[]){if(CheckA() && CheckB() ){printf(“Status OK”);}return 0;}A, 99和100 B, 99和101 C 99和99 D 101和998.下面的代码中,函数Test执行完毕后,希望输出无符号长整型的1。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
六、 系统编程 1、问:什么是程序?什么是进程?本质区别? 答:程序是存放在磁盘上一些指令的有序集合; 进程是程序执行的实例,是个动态的过程; 本质区别:程序是静态的,进程是动态的。 2、问:无名管道为什么只能在具有公共祖先的进程间通信?管道的特点? 答:因为无名管道没有名字,没法通过 open 的方法打开,进程只能通过 继承的方法获取管道文件描述符。 管道的特点: 1、半双工,数据在同一时刻只能在一个方向上流动。 2、只能在具有公共祖先的进程之间使用,通常用在父子管道之间。 3、管道对于管道两端的进程而言,就是一个文件,但他不是普通的 文件,不属于某个文件系统,并且只存在于内存中。 4、数据从管道的一端写入,从另一端读出。 5、没有名字。 6、管道的缓冲区是有限的。 7、管道所传送的数据是无格式的,这要求管道的读出方与写入方必 须事先约定好数据的格式,如多少字节算一个消息等。 8、写入管道的数据读完以后就从管道中消失。 3、问:管道与消息队列的区别? 答:管道与无名管道收发数据都是先进先出的, 消息队列可以实现按 消息的类型随机读取。 4、问: select()函数的作用? 答:用于一个进程同时监听多个文件描述符, 还可以设置监听超时时 间。 5、问:有名管道相比无名管道最大的优点是什么? 答:可以实现毫无干系的进程间通信。 6、问:什么是信号量,有什么特点,简述 PV 操作? 答:信号量就是个计数器,计数器的值只能是非负的。 操作计数器的方法是 PV 操作, PV 操作具有原子性(不可中断) ,要 执行就一定要执行成功,要么就不执行。 P 操作使信号量的值减一 当进行带堵塞的 P 操作的时候,如果信号量的值已经是 0 了,P 操 作就会堵塞。 V 操作使得信号量的值加一 7、问:什么是进程、什么是线程,它们之间的关系?实现多任务的优缺
缺点:中间包含了多次的搬运过程,效率稍微有点低。 2、问 : 为 什 么 Bootloader 大 多 由 两 个 阶 段 启 动 构 成 ? 以 你 熟 悉 的
bootloader 为列讲解一下两阶段分别干什么事情? 答: Bootloader 会直接对硬件进行操作,为了分离硬件相关性,一般 Bootloader 有两部分代码组成,第一部分一般由汇编来完成,完成与体 系相关的代码、功能的实现。 第二部分由 c 语言完成,完成与系统机构无关的通用功能的实现。 Vivi 的 stage l 实际完成的主要任务: 1、禁用看门狗、关闭所有中断、初始化系统时钟 2、设置 s3c2410 的内存相关的 13 个寄存器 3、初始化调试指示灯 4、初始化 uart ,作为调试口 5、从 NAND或 nor Flash 复制代码到 SDRAM 6、跳转到 main,进入 stage 2 Vivi 的 stage 2 实际完成的主要任务 1、step1 :打印版本信息 2、step2: 初始化 GPIO 3、step3 :MMU初始化 4、step4 :堆初始化 5、step5 :MTD设备初始化 6、step6 :存放 vivi 的私有参数
九、 平台与驱动部分: 1、问:Bootloader 在嵌入式系统中处于什么地位? bootloader 的主要作用 是什么? 答: Bootloader 是系统加电后、内核运行之前执行的一段代码,处于嵌 入式的最底层。 作用: 一、为启动内核准备好正确的软硬件、软件主要指堆、栈等; 硬件主要指内存、系统时钟等,最终将内核由固态存储器加载到内存中; 二、是为了更新、备份、回复系统提供控制平台。
5、问:林锐面试题中四个有关内存操作的问题: 第一题、运行会出现段错误(崩溃) : 答:因为参数是值传递,所以主调函数中的 str 指针已然指向空,不能向 里面拷数据,除非加上取地址,采用二维指针接收才能传递动态内存; 第二题:乱码: 答:实际上可能是乱码,也可能显示出一部分内容,显示乱码是因为刚才 那段栈内存空间全部被覆盖,如果未完全覆盖则显示一部分内容; 第三题:能够输出 hello 答:但由于没有在同一层释放内存,容易导致内存泄露; 第四题:对已经释放的内存进行操作 答:会破坏其它有用数据,后果难以预料,通常提示出现段错误。
Const char *const pConten 3、函数中使用 CONST
(1)const 修饰函数的参数
a 传递过来的参数在函数内不可以改变; void function (const int var);
b 参数指针所指内容为常量不可变; void function(const char *Var);
3、问:什么变量不能用指针指向? 答:寄存器变量( register 修饰),因为这个变量会优先选择存放到 CPU 寄存器中,而指针只能指向内存的任务区域,但不能指向寄存器。
4、问: 有符号字符型和无符号字符型变量的最大值和最小值分别是多少 (十 六进制多少),为什么? 答:有符号( -128 —127,-0X80— 0X7F),无符号( 0-255,0X00 —0XFF)。
进程: 优点:父子进程资源独享,不用考虑两进程利用公共资 源出现冲突。 缺点:资源开销比较大,子进程完全复制父进程的地址 空间,父子进程共享数据不方便。
线程: 优点:资源开销小,共享数据比较方便 缺点:因为资源共享,多个线程对公共资源进行访问的 时候要进行同步和互斥比较麻烦。
七、 网络编程 1、问: tcp 、udp、ip 、http 、telnet 协议分别位于 TCP/IP 协议哪一次? 答: tcp 、udp 位于传书层; ip 位于网络层; http 及 telnet 位于应用层。 2、问:路由器工作在 TCP/UDP的哪一次? 答:网络层 3、问: DNS是什么协议? 答:域名解析协议。 4、问:什么是 tcp 协议与 udp 协议?它们的区别及优缺点? 答: 1、用户数据报协议( UDP),UDP 协议是面向无连接的不可靠服务, 在传输数据之前不需要先建立连接。远地主机的运输层收到 UDP报文后, 不需要给出任何确认,传输数据快,能广播。 2 、传输数据报协议( TCP),TCP 则提供面向连接的可靠服务。在传 输数据前必须先建立连接,传输数据慢,不能广播。 5、问: ip 地址 192.168.220.22 属于什么 ip ? 答:属于私有 ip 7、问:什么是大端什么是小端字节序?网络字节序是大端还是小端? 答:小端:低地址存放低字节,高地址存放高字节; 大端:相反; 网络字节序是:大端。
点? 答:进程是系统资源分配的最小单位,线程是 CPU 调度和分配的最 小单位; 每个进程都拥有自己独立的系统资源, 而线程基本上没有自 己独立的系统资源。 关系:
1、一个进程中可以有多个线程, 线程必须依赖于进程存在, 如 果进程结束了,线程也就不存在了。
2、每个进程都至少有一个线程,称为主线程。 多任务优缺点:
一通过 C语言直接操作硬件? 答:因为 C有指针,它是 C语言的灵魂,它可以直接访问内存。
2、问:链表的作用? (这是上一个问题的延申,学员一般会举一堆例子来说 明它的作用,但这都不是重点,没有抓住主要矛盾 ) 答:链表用于内存管理, 链表节点中的指针域可以将不连续的内存彼此关 联起来,实现内存的动态管理。
6、问:哪些地方可以用到 const? const 变量和函数输入参数用 const 修饰有 哪些作用? 答: 1、定义常量 ( 1) const 修饰变量, const TYPE ValueName=value;value 是不可变的。 ( 2) 将 const 改为外部链接, 作用于扩大至全局, 编译时分配内存, 并 且可以不进行初始化,仅仅作为声明,编译器认为在在程序其他 地方进行了定义; Extend const int ValueName = value; 2、指针使用 CONST (1)指针本身是常量不可变 (char *) const pContent; Const ( char*) pContent; (2)指针指向的内容是常量不可变 Const char *pContent; Char const *pContent; (3)两者都不可变
八、 C++与 QT 1、问: QT区别于其他应用开发工具有什么优点及缺点? 答:有较强的移至性; 开源的开发工具;
用 C++语言实现,效率相对于其他面向对象语言执行效率较高; 强大的通信机制(信号和槽,比 MFC回调好); 支持 openGL可得到更加完美的 2D/3D 效果。 2、问:怎样理解 QT,QT是一种语言吗? 答:QT是一套应用程序开发框架, 也叫是开发工具或一套图形库, 用 C++ 语言来实现的。 3、问: QT 中信号与槽的主要作用是什么? 答:主要是在对象之间进行通信。 4、问: QT对信号间进行处理是通过什么方法实现的? 答:通过虚函数的方法,重新实现相应的事件函数。 5、问:面向对象设计与面向过程设计最大区别是什么? 答:面向对象的设计中, 程序是由一个或多个对象组成的, 每个对象负责 不同的任务, 一起让整个运行程序运行起来, 每一个对象又是由不同的类 实现,使得程序模块化更强。 而面向过程的设计, 就是程序从头到尾执行 的一个过程,需要自己去划分模块。
2 、问:简述 s3c2440 NAND/NOR两种启动方式的异同? 答: Nor 启动: 系统加电后会从 0X000000 开始的三总线位置读取第一条指令 进 行 工 作 , norFLASH 采 用 总 线 结 构 可 以 直 接 连 在 三 总 线 0X000000位置上,所以将 bootloader 烧到 norflash 0X000000 位置上,系统加电后即可运行 bootloader 的第一条代码,单 片机一般采用此种启动方式。 优点:硬件连接简单、可靠。 缺点: nor flash 由于结构的原因一般做不了太大,而且其读写速度 比较慢。 Nand 启动: 因为 nand 不支持总线线性寻址, 所以 cup 会从 nand 自动拷 4K 代码到内部 RAM,并从这段 RAM开发运行程序,所以这 4K 代码 往往是 Bootloader 的第一段代码,起作用为将 Bootloader 的 主要部分搬到内存中运行,然后进行后续工作。 优点:此方案充分利用了 nand 大容量存储、 sdram 高速运行的特点, 解决了嵌入式系统存储与运行的容量与速度问题;