一、基础题
1,冯诺依曼结构的计算机硬件逻辑组成中,不包含以下哪个模块?
A,编译器
B,控制器
C,输入设备
D,输出设备
解释:冯诺依曼由五个模块组成:输入设备 输出设备 存储器 控制器 运算器
故答案选择:A
2,假设有一个栈,元素依次进栈的顺序是A,B,C,D,E。下列不可能的出栈顺序是?
A,EDCBA
B,ABCDE
C,BCDEA
D,EABCD
解释:栈:先进后出
故答案选择:D
3,[多选]C语言中,static关键字说法正确的有?
A,用static修饰的全局变量可以在运行时修改
B,用static修饰的函数,其内部变量可以传递给其他函数
C,在a.c文件中,有一个static修饰的函数,任何情况下都不能可能在b.c中被调用
D,其余说法均不对
解释:参考自该篇博客static
函数体内 static 变量的作用范围为该函数体,不同于 auto 变量, 该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值
在模块内的 static 全局变量可以被模块内所有函数访问,但不能被模块外其他函数访问
在模块内的static 函数只可被这一模块内的其他函数调用,这个函数的使用范围被限制在声明它的模块内
在类的static 成员变量属于整个类所拥有,对类的所以对象只有一份拷贝
在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的 static 成员变量
若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度
若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度
设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题
static在c里面可以用来修饰变量,也可以用来修饰函数。
修饰变量
int a ;
int main()
{int b ; int c* = (int *)malloc(sizeof(int));
}
变量在c里面可分为存在全局数据区、栈和堆里。
a是全局变量,b是栈变量,c是堆变量。
static对全局变量的修饰,可以认为是限制了只能是本文件引用此变量。有的程序是由好多.c文件构成。彼此可以互相引用变量,但加入static修饰之后,只能被本文件中函数引用此变量。
static对栈变量的修饰,可以认为栈变量的生命周期延长到程序执行结束时。一般来说,栈变量的生命周期由OS管理,在退栈的过程中,栈变量的生命也就结束了。但加入static修饰之后,变量已经不再存储在栈中,而是和全局变量一起存储。同时,离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。
修饰函数
static对函数的修饰与对全局变量的修饰相似,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。
a.c文件
static int i; //只在a文件中用
int j; //在工程里用
static void init() //只在a文件中用
{
}
void callme() //在工程中用
{static int sum;
}
上面的全局i变量和init()函数只能用在a.c文件中,全局变量sum的作用域只在callme里。变量j和函数callme()的全局限扩充到整个工程文件。所以可以在下面的b.c中用extern关键字调用。extern告诉编译器这个变量或者函数在其他文件里已经被定义了。
b.c文件
extern int j; //调用a文件里的
extern void callme(); //调用a文件里的
int main()
{...
}
extern的另外用法是当C和C++混合编程时如果c++调用的是c源文件定义的函数或者变量,那么要加extern来告诉编译器用c方式命名函数:文件A.cpp调用a.c里面的变量i和函数callme()
extern "C" //在c++文件里调用c文件中的变量
{int j;void callme();
}
int main()
{callme();
}
全局变量有外部、静态两种存储方式。
1,全局变量一般用外部存储方式存储,用保留字extern加以定义。此时,变量的作用域是构成整个程序的所有程序文件,也就是定义的外部变量可供其它程序文件使用。(使用这样的全局变量一定要非常慎重,一旦产生错误,将波及整个程序。)
2,如果希望全局变量仅限于本程序文件使用,而其它程序文件中不能引用,这时必须将其存储方式定义为静态存储方式,用保留字static加以定义。此时称为静态外部变量。
对全局变量加static,定义为静态存储方式,并不意味着是静态存储;而不加static,是动态存储。两种形式的全局变量(外部变量)都是静态存储方式,都是编译时分配存储空间,但作用域不同。使用静态外部变量,有利于隔离错误,有利于模块化程序设计。
3,全局变量的缺省存储方式是外部存储方式。
对局部变量采用auto方式,对全局变量采用extern方式。
故答案选择:A、B
4,C语言中,在头文件正常引用的情况下,执行printf("%5s",“abcdefg”);后的结果为?
A,abcde
B,abcdefg
C,cdefg
D,输出错误信息
解释:
%5s 是把变量的值保持长度5位(不足5位时),不足5位在前面用空格补齐,超过5位就不用补空格,直接显示全部,以字符串方式输出。
%-5s 是把变量的值保持长度5位(不足5位时),不足5位在后面用空格补齐,超过5位就不用补空格,直接显示全部,以字符串方式输出。
故答案选择:A
5,在32位操作系统中,我们定义如下变量 int (*n)[10];请问调用函数sizeof(n),返回值为?
A,4
B,40
C,8
D,80
解释:
int(*n)[10]; 是数组指针 sizeof(n)=4
int* n[10]; 是指针数组 sizeof(n)=40
在32位操作系统下,只要是指针就是4个字节,占32位。
故答案选择:A
6,[多选]请说出const与#define相比,有何优点?
A,宏常量有数据类型,而const常量没有数据类型
B,有些集成化的测试工具可以对const常量进行调试,但是不能对宏常量进行调试
C,编译器可以对const进行类型安全检查。而对#define只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误
解释:
const常量有数据类型,而宏常量没有数据类型
编译器可以对const常量进行类型安全检查,而对宏常量只能字符替换
有些集成化的调试工具能对const常量进行调试,对宏常量不能调试
故答案选择:B、C
7,以下不是无限循环的语句为?
A,for(y=0,x=1;x>++y;x=i++) i=x;
B,for(;;x++=i);
C,while(1) {x++;}
D,for(i=10;;i–) sum+=i;
解释:其实看是否是无限循环就看for中的第二个判断是否退出条件即可
故答案选择:A
8,C语言中,逻辑“真”等价于?
A,大于零的数
B,大于零的整数
C,非零的数
D,非零的整数
解释:C语言没有提供逻辑型的数据类型,关系(及逻辑)表达式的值“假”用数值0代表,而非零的值(系统默认用1)表示“真”。
说白了就是 零(假) 和 非零(真)
故答案选择:C
9,(1)请写出bool flag 与 “零值”比较的if语句
//若flag有可能为true也有可能为false
if(flag)
if(! flag)
(2)请写出float x 与 “零值”比较的if语句
const float EPSINON = 0.00001;
if ((x >= - EPSINON) && (x <= EPSINON)
(3)请写出char *p 与 “零值”比较的if语句
//字符指针有可能为空指针也有可能不为空
if (p == NULL)
if (p != NULL)
10,运行以下代码会出现什么问题?
void getmemory(char *p)//调用GetMemory( str )后, str并未产生变化,依然是NULL.只是改变的str的一个拷贝的内存的变化
{p = (char *)malloc(100);strcpy(p,"hello world");//程序运行到这将产生错误//new的时候有可能内存出错,应该在*p = (char *) malloc( num );后判断内存是否申请成功//if (*p == NULL){//进行申请内存失败处理}
}
int main()
{char *str = NULL;getmemory(str);printf("%s/n",str);free(str);//释放动态创建的内存return 0;
}
参考博文
二、编程题
1,编程实现冒泡排序
我以前写过,这里就不在叙述,可参考我的这篇博客
#include <stdio.h>
int main()
{int i,j,t,a[10];for(i=0;i<10;i++){scanf("%d",&a[i]);}for(i=0;i<9;i++)//10个数,进行9次循环,进行9趟比较{for(j=0;j<9-i;j++)//在每一趟比较中,进行9-i次比较{if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}}}for(j=0;j<10;j++){printf("%d\n",a[j]);}return 0;
}
2,给定一个头节点为head的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
参考博文
定义一个fast和一个slow,fast每走两步,slow就走一步, 最终返回的slow就是中间的值(链表的节点个数为奇数偶数都适用)
class ListNode {public int val;public ListNode next;public ListNode(int val){this.val = val;this.next = null;}
}public class TestDemo1025_1 {public ListNode head;//给定一个头结点为 head 的非空单链表,返回链表的中间结点。
//如果有两个中间结点,则返回第二个中间结点。public ListNode middleNode() {ListNode fast = this.head;ListNode slow = this.head;while (fast != null && fast.next != null){fast = fast.next.next;slow = slow.next;}return slow;}
}
三、选做题
1,802.11b/g协议的非重叠信道有()个?
A,2
B,3
C,5
D,8
答案选择:B
2,无线局域网WLAN传输介质就是?
A,无线电波
B,红外线
C,载波电流
D,卫星通信
答案选择:A
3,如果Boot Loader、内核、启动参数以及其他的系统映像四部分在固态存储设备上分别独立存放,则其存储结构的分配顺序应当是:()
A,文件系统、内核、启动参数、Bootloader
B,启动参数、Bootloader、内核、文件系统
C,Bootloader、内核、启动参数、文件系统
D,Bootloader、启动参数、内核、文件系统
解释:华为认证考试题库中嵌入式软件助理工程师题库的一道题:Bootloader、启动参数、内核、文件系统
答案选择:D
4,Boot Loader的stage2通常使用C语言实现,以完成复杂的功能,以下哪一步骤属于stage2的内容:()
A,为加载Boot Loader的stage2准备RAM空间
B,设置好堆栈
C,硬件设备初始化
D,将Kernel映像和根文件系统映像从flash上读到RAM空间中
解释:为认证考试题库中嵌入式软件助理工程师题库的一道题:将kernel映像和根文件系统映像从flash上读到RAM空间中
答案选择:D
5,关于ARM处理器的异常的描述不正确的是()
A,复位属于异常
B,除数为零会引起异常
C,所有异常都要返回
D,外部中断会引起异常
答案选择:C