嵌入式软件面试基础_1

时间:2020-12-31 14:42:19

C基本语法

关键字inline、static、volatile、const的含义
关键字 介绍 详细介绍
inline 提高了运行速度,但是会增加代码量(省去了调用函数的开销,但是包含的函数的代码量会增多)。 http://blog.csdn.net/u011559046/article/details/73717856
static 存储在全局静态储存区,使用其可以降低模块间的耦合,可以用于统计函数调用次数。在模块内生命的变量或者是函数只能被模块内的函数使用或者调用 http://blog.csdn.net/u011559046/article/details/73718259
volatile 表明某个变量的值可能在外部被改变,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。 http://blog.csdn.net/u011559046/article/details/73718844
const const 1)只读。2)使用关键字const也许能产生更紧凑的代码。3)使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。能提高程序的健壮性。 http://blog.csdn.net/u011559046/article/details/73718531 http://note.youdao.com/noteshare?id=8f4f320b490aeb728c95414792676fb8&sub=274AC324318848BEBA03A7F32132CD5F
const
声明 含义
const int a; a是一个常整型数
int const a; a是一个常整型数
const int *a; a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)
int * const a; a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)
int const * a const; a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)

关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。

volatile
  1. 一个参数既可以是const还可以是volatile吗?解释为什么。
    可以,一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
  2. 一个指针可以是volatile 吗?解释为什么。
    可以,尽管这并不很常见。一个例子是当一个中断服务子程序修改一个指向一个buffer的指针时。
  3. 下面的函数有什么错误:int square(volatile int ptr){return *ptr *ptr;}
    这段代码的目的是用来返回指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:
    int square(volatile int *ptr) 
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}

由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:

    long square(volatile int *ptr) 
{
int a;
a = *ptr;
return a * a;
}
typedef和define的用法
关键字 介绍
typedef 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,以增强程序的可读性。
define define为一宏定义语句,通常用它来定义常量(包括无参量与带参量),以及用来实现那些“表面似和善、背后一长串”的宏,它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了,但也因此难以发现潜在的错误及其它代码维护问题。
    typedef struct demo
{
char a;
int b;
}DEMO_T
#define a (1000)
for(;1;) for(; ;)

均表示死循环

do……while和while……do的区别
do{

  statement

}while(expression);

do-while 语句至少执行一次循环体内的代码。

  while(expression);
statement

while 条件不成立,语句永远不会执行循环体内的代码。

分析题目

  #include
  main()
  {
   int a,b,c,d;
   a=10;
   b=a++;
   c=++a;
   d=10*a++;
   printf(“b,c,d:%d,%d,%d”,b,c,d);
   return 0;
  }
  

b = 10
c = 12
d = 120
a = 13

C语言运算符优先级

设有以下说明和定义:(32位编译器情况下)

在32位机器上:

typedef union
{
long i;
int k[5];
char c;
}DATE1;
struct date
{
int cat;
DATE1 cow;
double dog;
}DATE2;

struct date2
{
char a;
int b;
char c;
}DATE3;

#pragma pack(4)
struct DATE4
{
char x1; //1
short x2; //补齐1+ 2
float x3; //4
char x4; //1 补齐+3
};
#pragma pack()

#pragma pack(4)
struct DATE5
{
char a; //1
char b[3]; //3
char c; //1 + 补齐3
int d; //4
};
#pragma pack()

#pragma pack(2)
struct DATE6
{
char a[5]; //5 + 补齐1
double b; //8
};
#pragma pack()

#pragma pack(4)
struct DATE7
{
char a; //1
char b[3]; //3
char c; //1
int d; //4
}__attribute__ ((packed)); ;
#pragma pack()


sizeof(DATE1) = ?
sizeof(DATE2) = ?
sizeof(DATE3) = ?
sizeof(DATE4) = ?
sizeof(DATE5) = ?
sizeof(DATE6) = ?
sizeof(DATE7) = ?
  

union结构,在union结构中所有变量共用同一个空间,union 的大小按最大的变量来算:sizeof(DATE1) = 4*5 = 20。
sizeof(DATE2) = 4 + 20 + 8 = 32。
齐原则分析后,检查计算出的存储单元是否为所有元素中所占内存最大的元素的长度的整数倍,是,则结束;若不是,则补齐为它的整数倍。
sizeof(DATE3) = 4 + 4 + 4 = 12。
sizeof(DATE4) = 1+ 3 + 4 + 4 = 12。
sizeof(DATE5) = 1+ 3 + 4 + 4 = 12。
sizeof(DATE6) = 6 + 8 = 14。
sizeof(DATE7) = 1 + 3 + 1 + 4 = 9。

C语言字节对齐、结构体对齐最详细的解释