嵌入式面试(笔试)笔记2
本文是对于下面链接的B站系列视频的学习笔记
语言笔试题,C++笔试题,嵌入式笔试题,面试题,难点疑点解析(持续更新)
在另外一篇文章的基础上增加或者强调一些对自己更重点的知识
另一篇文章的链接:
【常见c语言笔试题嵌入式软件开发2】
P28:仿照字符串库函数strcpy,自己编写一个字符串拷贝函数,不允许使用C库函数,要求两个参数,第一个参数是要拷贝的目的地址,第二个参数是拷贝字符串的来源。
#include <stdio.h>
char * mystrcpy(char *des,const char*src)//加了const可以防止来源处值被改变
{
char *temp = des;
if(des == NULL ||src == NULL)
{
return NULL ;
}
if(des == src)
{
return des;
}
while(*des++ = *src++);//字符串结尾为"\0",ASCII码为NULL,所以不用加其他条件即可停止
return temp;
}
第二种写法:
#include <stdio.h>
char * mystrcpy(char *des,const char*src)
{
int delta = des-src;
if(des == NULL ||src == NULL)
{
return NULL ;
}
if(des == src)
{
return des;
}
while(*(src+delta) = *src++);//这样写可以省略寻址dest和dest++的操作,节省时间
return dest;//不再需要temp来返回,直接返回dest即可
}
P31:请说明下面这段代码的运行结果
#include <stdio.h>
int main(void)
{
unsigned char *p1;
unsigned long *p2;
p1 = (unsigned char *)0x801000;
p2 = (unsigned long *)0x801000;
printf("p1 + 5 = 0x%x\n",p1 + 5);
printf("p2 + 5 = 0x%x\n",p2 + 5);
return 0;
}
p1 + 5 = 0x801005
p2 + 5 = 0x801028
char
类型的指针不代表只能表示8bit的地址,它可以表示所有的地址,只是它指向的那个地址里面存放的数据的数据类型是char
P32:下面的函数有什么错误:
int square(volatile int *pt)
{
return (*pt)*(*pt);
}
编译器会对代码进行如下处理:
int square(volatile int *pt)
{
int a,b;
a = *pt;
b = *pt;
return (a)*(b);
}
此时a和b的值可能是不一样的
P34:指出下面代码的输出,并解释为什么?
#include <stdio.h>
int main(void)
{
int a[5] = {1,2,3,4,5};
int *pt = (int *)(&a + 1);
printf("%d %d\n",*(a+1),*(pt - 1));
return 0;
}
a为a的第一个元素的地址,&a为把a作为整体的首地址,从取值上讲两者相等。
但是a+1为a的第二个元素的地址,而&a+1为在a的基础上再加一个a的大小,即加4*5=20,如果之后还有&a+2,则再加20.
此题中*(a+1)
为2,*(pt - 1)
为加了一个20之后减去4,即为a[5]的位置。
P39:阅读下面代码以下说法正确的是:
int main(void)
{
char aChar;
int aInt;
aInt = aChar = -120;
printf("%d\n",aInt);
return 0;
}
A.一定输出-120
B.一定不能输出-120
C.可能输出-120
存疑
视频中说要考虑大端小端的问题,所以char赋值给int时可能会赋到高位导致结果不是-120,所以选C。
但是小数据类型给大数据类型赋值时不是会先进行符号位扩展吗,这种情况真的会发生吗?
P45:请问如下语句是什么意思:typedef int (*funcptr)();
定义了一个新的类型:funcptr,该类型为:一个无输入,返回值为int的函数指针
关于typedef与函数指针,可以参考这篇文章:typedef函数指针用法
P46:C和C++中const的区别
在C中,const虽然名称上是定义一个常量,但实际上并不是常量,他是可以用指针来修改的,而且我们不可以用const定义的变量来初始化数组维度。
const int n = 5;
int a[n];
在C中这是不可以的,但是在C++中,这是可以的。
P49:构造函数可以不通过类的对象来调用
C++的知识点,简单记录
P60:查看下面代码,看有无问题,如果有问题怎么修改
void GetMemory(char *p);
int main(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "Hello World");
printf("%s\n",str);
}
GetMemory(char *p);
{
p = (char*)malloc(100);
}
GetMemory
的输入是指针,那么只是形参,是”按值传递”,在给p申请完地址离开函数GetMemory
之后,str还是指向空。
所以GetMemory
的输入应该是指针的地址,即指针的指针。
改正后代码:
void GetMemory(char **p);
int main(void)
{
char *str = NULL;
GetMemory(&str);
strcpy(str, "Hello World");
printf("%s\n",str);
}
GetMemory(char **p);
{
*p = (char*)malloc(100);
}