嵌入式c语言基础面试问题(三)

目录

1.逻辑运算符的使用注意事项?

2.掩码的作用?什么时候使用& | ^

3.位运算的作用?

4.使用异或交换两个变量的值?使用四则运算交换?

5.谈谈你对指针的理解(什么是指针?指针的作用?指针的运算?)

6.指针变量的大小为什么是固定的?

7.为什么会有不同类型的指针?

8.万能指针的作用及注意事项?

9.什么是野指针?如何避免野指针?如何检测野指针? 

10.指针减法运算的意义?


1.逻辑运算符的使用注意事项?

(1)注意逻辑运算符的优先级,一般用括号解决优先级问题。
(2)注意运算符是短路与还是短路或,短路与是当前一个条件不满足时,后面条件不执行,短路或时是前一个条件满足时后面条件不执行

2.掩码的作用?什么时候使用& | ^

掩码就是 一串二进制代码对目标字段进行位运算,屏蔽当前的输入位,最终得到一个合理的需求,用来 辅助位运算的
按位与是用来对特定位清零或者去取特定位的值
按位或是将特定位置 1,其他位保持不 变
按位异或是将特定位值取反,同时异或还具有不引入第三方量,交换两个变量值的功能。

清零取位要用与

某位置一可用或

若要取反和交换 轻轻松松用异或

清零特定位 (mask 中特定位置 0,其它位为 1,s=s& mask)

取某数中指定位 (mask 中特定位置 1,其它位为 0,s=s& mask)

常用来将源操作数某些位置 1,其它位不变。 (mask 中特定位置 1,其它位为 0 s=s|mask)

使特定位的值取反 (mask 中特定位置 1,其它位为 0 s=s^mask)

3.位运算的作用?

位运算主要是 直接操控二进制数 时使用 ,主要目的是 节约内存 ,使程序速度更快,还有就
是在对内存要求苛刻的地方使用。

4.使用异或交换两个变量的值?使用四则运算交换?

int a = 5, b = 10;

a = a ^ b;
b = a ^ b; // Now, b is the original value of a
a = a ^ b; // Now, a is the original value of b

printf("a = %d, b = %d\n", a, b);
int a = 5, b = 10;
int temp;

temp = a;
a = b;
b = temp;

printf("a = %d, b = %d\n", a, b);

5.谈谈你对指针的理解(什么是指针?指针的作用?指针的运算?)

第一:指针是一个变量,用来保存地址的,作为变量,他有固定的字节长度和取值范围, 在 32 位系统中占四个字节,在 64 位系统中占八个字节,作为变量,他还有作用域,局部 指针变量存放在栈上,全局指针变量存放在数据区。
第二:指针的存在提高了编写效率,如果没有指针,我们获取地址时都会进行一个强制类 型转换,效率低。我们创建 int *p:p 保存整形变量的地址,*p 是获取 p 内地址指向的内 存空间的值。
第三:指针在运算时,必循遵循相同类型的指针变量之间赋值,同时指针的减法运算可以 获取两个地址之间有多少个元素。在运算是还需要注意优先级,*和++的优先级是相同的, 使用括号解决问题。
*start++; === *(start++)
优先级++、*相同,结合律从右往左,所以 start++先求值
*++start; ==== (*start)++

6.指针变量的大小为什么是固定的?

假设说我的系统是 32 位的,我就能寻址 (2^32)-1 位,也就是 0-0xffff ffff ,占 4 个字节。

7.为什么会有不同类型的指针?

不同地址拥有不同步长,什么类型的地址必须使用相同类型的指针变量进行保存。指针的
步长指的是,当指针 +1 时候,移动多少 字节单位
整形的步长 4 个字节, +1 跳过四个字节;;字符形步长 1 字节, +1 跳过 1 字节

8.万能指针的作用及注意事项?

万能指针可以接受任何指针变量的值,函数的返回值和形参使用万能指针可以 提高通配
使用时要注意不能通过 * 来获取指向空间。

9.什么是野指针?如何避免野指针?如何检测野指针? 

两种情况下会存在野指针

第一个是定义了一个指针变量,没有给他指向有效空间或者置 为空时,系统会默认初始化一个随机地址,变成野指针。

第二个是,在释放一个指针变量 指向空间时,没有置空,也会变成野指针。

野指针的使用会产生内存泄漏。 野指针不会直接引发错误,操作野指针指向的内存区域才会出问题。

所以无法通过简单判 断是否为空避免,只能通过养成良好的编程习惯尽量去减少。 我们养成良好的编码习惯包括以下几点:

第一,定义一个指针变量时,要么设为空,要么指向合法的内存。

第二:向指针变量指向 的空间赋值时一定要开辟内存空间。

第三:开辟空间后需要检查是否分配成功。

第四: 分配成功后要进行初始化。

第五:注意使用时不要越界访问,否则会产生内存泄漏。

第 六:结束时一定要释放内存空间。

第七:释放完之后要将指针变量置为空。 养成良好的编码习惯只能是尽量避免,不能完全杜绝,野指针引发的内存泄露问题,通常 我们会使用内存检测工具, 大多数情况下,我们会选择 gcc 自带的工具 ASAN,还有 valgrind 工具。

10.指针减法运算的意义?

指针和指针做减法适用于两个指针都指向同一个数组, 相减结果为 两个指针之间的元素数目
指针加减数值表示的意义是指针在 数组中位置的移动
  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值