嵌入式Linux工程师笔试记录 -- 2020.7.31 (二)
做题时间:2020.7.30 23:38
总结时间:2020.7.31
嵌入式Linux工程师笔试记录 -- 2020.7.31
1.按以下三种方式定义的数组有什么区别?
char p1[] = {"abcdef"};
char p2[] = "abcdef";
char p3[] = {'a','b','c','d','e','f'};
考点:字符数组与字符串数组
回答:
1) p1和p2位字符串数组,编译器自动为其在末尾加’\0’,作为字符串结束标志。
2) p2是p1的简写,相当于字符数组
p[] = {‘a’,’b’,’c’,’d’,’e’,’f’,’\0’};长度为7
3)而p3是字符数组,字符数组不要求最后一个字符为’\0’,初始化时系统不会自动加’\0’,长度为6.
2.程序中使用宏定义有哪些好处
参考:#define宏定义的优点和缺点
1)宏定义的优点:
a.方便程序修改:使用宏代替在程序中经常使用的常量,比如某个io的寄存器地址、延时时间等。或者将较长的标识符用较短且有意义的标识符来宏定义,方便写程序。同时,将这些参数宏定义于程序头部,方便其他人阅读与修改并使用。
b. 提高程序运行效率(宏函数):宏函数相比普通函数,是直接替换到使用宏的位置,少了跳转到函数位置,并在结束的时候返回到原程序的步骤,提高程序效率。
2)宏定义的缺点:
a.使用过vs编写c++应该都看到编译器推荐将#define修改为const,原因就是宏定义的一个缺点:无法对宏定义中的变量进行类型检查。
3)宏定义的注意点:
必须在各个分量中加括号(不能说缺点把emmm,应该指注意事项)
由于宏定义只是单纯替换,所以不加括号可能会由于运算符优先级问题导致结果不符预期。
3.结合实际简述软件工程中关于内聚和耦合的理解
参考 : 简述耦合与内聚
1.耦合是指模块之间的关联程度。如果一个模块依赖另一个模块,A依赖B,B依赖C,当C要更新版本的时候,那么B也要更新,A也要更新。所以,为了便于维护更新,需要低耦合。像计算机网络,Linux操作系统,都使用分层思想,每一层的工程师都主要专注于自己这一层的开发就行了。
2.内聚是对于块内联系,高内聚是指一个模块只左一件事。比如在类中,显示用display,赋值用set。
一个工程要便于维护,最好的方式就是低耦合,高内聚。
4.简述面向对象程序设计方法的核心特点及你的理解
参考链接:c++面向对象的三个特点
面向对象三大特征:封装、继承、多态
封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
继承:扩展已存在的类。继承创建的新类称为子类,被继承的类称为父类。目的是代码可重用。
多态:目的是为了接口重用。具体实现有两种方式:覆盖和重载,覆盖是指子类重新定义弗雷的虚函数的做法。重载是指允许多个同名但参数表不同的函数,程序调用时会根据参数不同而调用不同函数。
5.用C语言些一个模块化函数,实现将一个字符串插入到另一个字符串中的指定位置
不同于之前的内存拷贝函数,
嵌入式Linux工程师笔试记录 – 2020.7.28 (一)–14.写一个函数完成内存拷贝。
此题说明了一个字符串插入到另一个字符串指定位置,表示两个字符串互相独立,假设无地址重叠,得以下解:
#include <stdio.h>
#include <assert.h>
#include <string.h>
/*
功能:将s2插入到s1的count位置
*/
void insert ( char *s1, const char *s2 , int count ){
assert( s1 && s2 ); /* 检查是否为空 */
assert( strlen(s1) >= count ); /* 所给count是否合法 */
int i = 0 ;
int s1_cur_len = strlen(s1);
char temp[strlen(s1)] ;
for( i = count ; i < s1_cur_len ; i ++ ){
/* 1.存储count之后的字符临时存储到temp中 */
temp[i-count] = s1[i];
s1[i] = '\0'; // 清空
}
for( i = 0 ; i < strlen(s2) ; i ++ )
/* 2.将s2插入到s1的count之后 */
s1[i+count] = s2[i];
s1_cur_len = strlen(s1); // 更新s1当前长度
for( i = 0 ; i < strlen(temp) ; i ++ )
/* 3.将temp插入到s1末尾 */
s1[s1_cur_len+i] = temp[i];
return;
}
int main(int argc , char **argv ){
assert(argc>2);
char s1[strlen(argv[1])];
char s2[strlen(argv[2])];
strcpy(s1 , argv[1]);
strcpy(s2 , argv[2]);
printf("s1 = %s\ns2 = %s\n" , s1, s2);
insert( s1 , s2 , 2 );
printf("s3 = %s\n" , s1);
return 0;
}
上一篇: 经常用的图片在容器中的水平垂直居中实例_javascript技巧
下一篇: 嵌入式学习记录(一)