嵌入式面试(笔试)笔记2

嵌入式面试(笔试)笔记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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值