没有合适的资源?快使用搜索试试~ 我知道了~
嵌入式八股文精简版.pdf
需积分: 0 5 下载量 175 浏览量
2024-05-10
10:22:31
上传
评论
收藏 4.04MB PDF 举报
温馨提示
试读
221页
嵌入式八股文精简版.pdf
资源推荐
资源详情
资源评论
嵌入式八股文精简版
C/C++
关键字
C语言宏中"#“和”##"的用法
1.
(
#
)字符串化操作符
作用:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串。其只能用于有传入参数的宏
定义中,且必须置于宏定义体中的参数名前。
如:
2.
(
##
)符号连接操作符
作用:将宏定义的多个形参转换成一个实际参数名。
如:
使用:
注意:
a. 当用##连接形参时,##前后的空格可有可无。
如:
b.
连接后的实际参数名,必须为实际存在的参数名或是编译器已知的宏定义。
c.
如果
##
后的参数本身也是一个宏的话,
##
会阻止这个宏的展开。
1
#define example( instr ) printf( "the input string is:\t%s\n", #instr )
2
#define example1( instr ) #instr
当使用该宏定义时:
1
example( abc ); //
在编译时将会展开成:
printf("the input string is:\t%s\n","abc")
2
string str = example1( abc ); //
将会展成:
string str="abc"
1 #define exampleNum( n ) num##n
1
int num9 = 9;
2
int num = exampleNum( 9 ); //
将会扩展成
int num = num9
2 //
相当于
#define exampleNum( n ) num##n
num ## n
1 #define exampleNum( n )
1
#include <stdio.h>
2
#include <string.h>
3
结果:
关键字volatile有什么含意?并举出三个不同的例子?
1.
并行设备的硬件寄存器。存储器映射的硬件寄存器通常加volatile,因为寄存器随时可以被外设硬
件修改。当声明指向设备寄存器的指针时一定要用volatile,它会告诉编译器不要对存储在这个地
址的数据进行假设。
2.
一个中断服务程序中修改的供其他程序检测的变量。volatile提醒编译器,它后面所定义的变量随
时都有可能改变。因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中
读取数据
。如果没有
volatile
关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的
值,如果这个变量由别的程序更新了的话,将出现不一致的现象。
3.
多线程应用中被几个任务共享的变量
。单地说就是防止编译器对代码进行优化
.
比如如下程序:
对外部硬件而言,上述四条语句分别表示不同的操作,会产生四种不同的动作,但是编译器却会对上述
四条语句进行优化,
认为只有
XBYTE[2]=0x58
(
即忽略前三条语句,只产生一条机器代码
)。如果键入
volatile
,编译器会逐一的进行编译并产生相应的机器代码(产生四条代码)。
关键字static的作用是什么?
1.
在函数体,只会被初始化一次,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2.
在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块
外其它函数访问。它是一个
本地的全局变量
(只能被当前文件使用)。
3.
在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制
在声明它的模块的本地范围内使用(
只能被当前文件使用
)。
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#define STRCPY(a, b)
int
main()
{
char var1_p[20
];
char var2_p[30];
strcpy(a ## _p, #b)
strcpy
(var1_p, "aaaa");
strcpy
(var2_p, "bbbb");
STRCPY
(var1, var2);
STRCPY
(var2, var1);
printf
("var1 = %s\n", var1_p);
printf
("var2 = %s\n", var2_p);
//STRCPY(STRCPY(var1,var2),var2);
//
这里是否会展开为: strcpy(strcpy(var1_p,"var2")_p,"var2“)?答案是否定的:
//
展开结果将是:
strcpy(STRCPY(var1,var2)_p,"var2")
//##
阻止了参数的宏展开
!
如果宏定义里没有用到
#
和
##,
宏将会完全展开
//
把注释打开的话,会报错
:implicit declaration of function 'STRCPY'
return 0;
}
1
var1 = var2
2
var2 = var1
1 XBYTE[2]=0x55;
2 XBYTE[2]=0x56;
3 XBYTE[2]=0x57;
4 XBYTE[2]=0x58;
在
C
语言中,为什么
static
变量只初始化一次?
对于所有的对象(不仅仅是静态对象),初始化都只有一次,而由于静态变量具有“记忆”功能,初始化
后,一直都没有被销毁,都会保存在内存区域中,所以不会再次初始化。存放在静态区的变量的生命周
期一般比较长,它与整个程序“同生死、共存亡”,所以它只需初始化一次。而auto变量,即自动变量,
由于它
存放在栈区
,一旦函数调用结束,就会
立刻被销毁
。
extern”C” 的作用是什么?
extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编
译器这部分代码按C语言的进行编译,而不是C++的。
const有什么作用?
1.
定义变量(局部变量或全局变量)为常量,例如:
2.
修饰函数的参数,表示在函数体内不能修改这个参数的值。
3.
修饰函数的返回值。
a.如果给用 const修饰返回值的类型为指针,那么函数返回值(即指针)的内容是不能被修改的,
而且这个返回值只能赋给被
const
修饰的指针。例如:
b.如果用 const修饰普通的返回值,如返回int变量,由于这个返回值是一个临时变量,在函数调用
结
束后这个临时变量的生命周期也就结束了,因此把这些
返回值修饰为
const
是没有意义
的。
4.
节省空间,避免不必要的内存分配。例如:
什么情况下使用const关键字?
1.
修饰一般常量。一般常量是指简单类型的常量。这种常量在定义时,修饰符const可以用在类型说
明符前,也可以用在类型说明符后。例如:
2.
修饰常数组。定义或说明一个常数组可以采用如下格式:
3.
修饰常对象。常对象是指对象常量,定义格式如下:
1
const int N=100;//
定义一个常量
N
2
N=50; //
错误,常量的值不能被修改
3
const int n; //
错误,常量在定义的时候必须初始化
1
const char GetString() //
定义一个函数
2
char *str= GetString() //
错误,因为
str
没有被
const
修饰
3
const char *str=GetString() //
正确
1
#define PI 3.14159//
该宏用来定义常量
2
const doulbe Pi=3.14159//
此时并未将
P
放入只读存储器中
3
double i=Pi//
此时为
Pi
分配内存,以后不再分配
4
double I=PI//
编译期间进行宏替换,分配内存
5
double j=Pi//
没有内存分配再次进行宏替换,又一次分配内存
1 int const x=2
;
const int x=2
1 int const a[8]={1,2,3,4,5,6,7,8}
2 const int a[8]={1,2,3,4,5,6,7,8}
定义常对象时,同样要进行初始化,并且该对象不能再被更新。修饰符 const可以放在类名后面,也可
以放在类名前面。
4.
修饰常指针
5.
修饰常引用。被
const
修饰的引用变量为常引用,一旦被初始化,就不能再指向其他对象了。
6.
修饰函数的常参数。
const
修饰符也可以修饰函数的传递参数,格式如下:
告诉编译器
Var
在函数体中不能被改变,从而防止了使用者一些无意的或错误的修改。
7.
修饰函数的返回值。 const修饰符也可以修饰函数的返回值,表明该返回值不可被改变,格式如
下:
8.
在另一连接文件中引用
const
常量。使用方式有
new/delete与malloc/free的区别是什么?
1.
new
、
delete
是
C++
中的操作符,而
malloc
和
free
是标准库函数。
2.
对于非内部数据对象来说,只使用malloc是无法完成动态对象要求的,一般在创建对象时需要调用
构造函数,对象消亡时,自动的调用析构函数。而malloc free是库函数而不是运算符,不在编译器
控制范围之内,不能够自动调用构造函数和析构函数。而NEW在为对象申请分配内存空间时,可以
自动调用构造函数,同时也可以完成对对象的初始化。同理,delete也可以自动调用析构函数。而
mallloc
只是做一件事,只是为变量分配了内存,同理,
free
也只是释放变量的内存。
3.
new返回的是指定类型的指针,并且可以自动计算所申请内存的大小。而 malloc需要我们计算申请
内存的大小,并且在返回时强行转换为实际类型的指针。
strlen("\0") =? sizeof("\0")=?
strlen("\0") =0
,
sizeof("\0")=2
。
strlen用来计算字符串的长度(在C/C++中,字符串是以"\0"作为结束符的),它从内存的某个位置(可
以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描直到碰到第一个字符串结束
符\0为止,然后返回计数器值sizeof是C语言的关键字,它以字节的形式给出了其操作数的存储大小,操
作数可以是一个表达式或括在括号内的类型名,操作数的存储大小由操作数的类型决定。
1
class A
:
2
const A a
:
3
A const a
:
1
const int*p
;
//
常量指针,指向常量的指针。即
p
指向的内存可以变,
p
指向的数值内容不可变
2
int const*p
;
//
同上
3
int*const p
;
//
指针常量,本质是一个常量,而用指针修饰它。 即
p
指向的内存不可以变,但是
p
内存
位置的数值可以变
4
const int* const p
;
//
指向常量的常量指针。即
p
指向的内存和数值都不可变
1 void Fun
(
const int Var
)
1
const int FunI
(
)
;
2
const MyClass Fun2
();
1
extern const int 1
:
2
extern const int j=10
;
sizeof和strlen有什么区别?
strlen
与
sizeof
的差别表现在以下
5
个方面。
1.
sizeof是运算符(是不是被弄糊涂了?事实上, sizeof既是关键字,也是运算符,但不是函数),
而
strlen
是函数。
sizeof
后如果是类型,则必须加括弧,如果是变量名,则可以不加括弧。
2.
sizeof
运算符的结果类型是
size_t
,它在头文件中
typedef
为
unsigned int
类型。该类型保证能够
容纳实现所建立的最大对象的字节大小
3.
sizeof
可以用类型作为参数,
strlen
只能用
char*
作参数,而且必须是以
“0
结尾的。
sizeof
还可以以
函数作为参数,如
int g
(),则
sizeof
(
g
())的值等于
sizeof
(
int
的值,在
32
位计算机下,该
值为
4
。
4.
大部分编译程序的
sizeof
都是在
编译
的时候计算的,所以可以通过
sizeof
(
x
)来定义数组维数。
而 strlen则是在运行期计算的,用来计算字符串的实际长度,不是类型占内存的大小。例如, char
str[20] = "0123456789”
,字符数组
str
是
编译期
大小已经固定的数组,在
32
位机器下,为
sizeof
(
char
)
*20=20
,而其
strlen
大小则是在
运行期
确定的,所以其值为字符串的实际长度
10
。
5.
当数组作为参数传给函数时,传递的是指针,而不是数组,即传递的是数组的首地址。
不使用 sizeof,如何求int占用的字节数?
输出为:
上例中,
(
char*
)
& Value
返回
Value
的地址的第一个字节,
(
char*
)(
& Value+1
)
返回
value
的地址的下一个地址的第一个字节,所以它们之差为它所占的字节数。
C语言中 struct与 union的区别是什么?
struct(结构体)与 union(联合体)是C语言中两种不同的数据结构,两者都是常见的复合结构,其区
别主要表现在以下两个方面。
1.
结构体与联合体虽然都是由多个不同的数据类型成员组成的,但不同之处在于联合体中所有成员共
用一块地址空间,即联合体只存放了一个被选中的成员,而结构体中所有成员占用空间是累加的,
其所有成员都存在,不同成员会存放在不同的地址。在计算一个结构型变量的总长度时,其内存空
间大小等于所有成员长度之和(需要考虑字节对齐),而在联合体中,所有成员不能同时占用内存
空间,它们不能同时存在,所以
一个联合型变量的长度等于其最长的成员的长度
。
2.
对于联合体的不同成员赋值,将会对它的其他成员重写,原来成员的值就不存在了,而对结构体的
不同成员赋值是互不影响的。
举个例子。下列代码执行结果是多少?
1
#include <stdio.h>
2
#define MySizeof(Value) (char *)(&value+1)-(char*)&value
3
int main()
4 {
5
int i ;
6
double f;
7
double *q;
8
printf("%d\r\n",MySizeof(i));
9
printf("%d\r\n",MySizeof(f));
10
printf("%d\r\n",MySizeof(a));
11
printf("%d\r\n",MySizeof(q));
12
return 0; 13
}
1 4 8 32 4
剩余220页未读,继续阅读
资源评论
huliangj
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 一个基于 React、Dva、DataV、ECharts 框架的大数据可视化平台 支持数据动态刷新渲染、屏幕适配
- WordPress响应式简约博客主题Alt-Blog主题
- 46核心知识点四十六: H(z)零极点与系统因果稳定性(8772342).vip
- 233513264879476androidfiletransfer.dmg.zip
- 电影TensorFlow推荐系统
- STM32驱动SD卡SPI方式源码(Keil5打开)
- 基于SpringBoot的商城购物网站系统毕业设计源码+数据库(高分项目)
- LAMP.iso (7.4)可使用
- btstack协议栈实战篇-GAP Classic Inquiry
- 高炉瓦斯灰的铁铝再利用研究开题报告
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功