1. Static的用处
1. Static修饰变量的时候,则该变量存储在静态数据区,如果是局部静态变量则程序分配一次内存,函数结束,变量不消失;如果是全局静态变量则该变量的作用域只能限制在本文件,不能被外部文件引用。
2. Static修饰函数的时候,使得这个函数的作用域限定在这个文件范围,不能被外部文件引用。
(1.限制变量的作用域
(2.设置变量的存储域
2. 引用和指针有什么区别
1.引用必须被初始化,指针不必。
2.引用初始化以后不能被改变,指针可以改变所指的对象。
3.不存在指向空值的引用,但是存在指向空值的指针。
3.描述实时系统的特性
在特定时间里面完成特定的任务,实时性和稳定性
4.全局变量和局部变量在内存中的区别
局部变量存储在内存的栈区,作用域为函数域
全局变量存储在静态数据区,作用域为文件域
5.平衡二叉树
6.堆栈溢出一般是由什么原因导致的?
分配的内存没有及时回收
7. 冒泡排序算法的时间复杂度
O(n^2)
8. 写出float x 与“零值”比较的if语句
If((x >= -0.000001)&&(x<= 0.000001))
9.typedef union {long i;int k[5]; char c;} DATE;
struct data { int cat; DATE cow; double dog;} too;
DATE max;
则语句printf("%d",sizeof(struct date)+sizeof(max));输出为_52___
10.队列和栈的区别
队列先进先出,栈后进先出!
11.#include
int inc(int a)
{
return(++a);
}
int multi(int *a, int *b,int*c)
{
return(*c=*a**b);
}
typedef int(FUNC1)(int in);
typedef int(FUNC2) (int*,int*,int*);
void show(FUNC2fun, int arg1, int*arg2)
{
INC p=&inc;
int temp =p(arg1);
fun(&temp,&arg1, arg2);
printf("%d\n",*arg2);
}
main()
{
int a;
show(multi,10,&a);
return 0;
}
输出为:110
12.以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”
1、#include"string.h"
2、main()
3、{
4、char*src="hello,world";
5、char* dest=NULL;
6、int len=strlen(src);
7、dest=(char*)malloc(len);
8、char* d=dest;
9、char* s=src[len];
10、while(len--!=0)
11、d++=s--;
12、printf("%s",dest);
13、return 0;
14、}
改:6.int len = strlen(src)+1;
9.char *s = &src[len-1];
11 . *d++= *s--;
增加:*d = 0;
free(dest);
13.用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
#define Every_Year_Sec(365*24*60*60)UL
14. 写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个
#define MIN(X,Y)((X)<=(Y)?(X):(Y))
15. 预处理器标识#error的目的是什么?
编译的时候提示错误信息!
16. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?
While(1)
{
}
17. 用变量a给出下面的定义
a) 一个整型数(An integer) int a;
b) 一个指向整型数的指针(A pointer to an integer) int*a;
c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer
to an integer)int **a;
d) 一个有10个整型数的数组(An array of 10 integers) inta[10];
e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to
integers) int*a[10];
f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers) int (*a)[10];
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a fu
nction that takes an integer as an argument and returns an integer)int (*a)(int a);
h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型
数( An array of ten pointers to functions that take an integer argumentand r
eturn an integer )int(*a[10])(int a);
18.关键字const是什么含意?
只读的意思
const int a; a是一个常整形
int const a; a是一个常整形
const int *a; a是一个指向常整形的指针
int * const a; a是一个指向整形的常指针
int const * a const; a是一个指向常整形的常指针
19.关键字volatile有什么含意 并给出三个不同的例子
指示这个变量禁止编译器进行优化,容易被外部条件意外的改变
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3). 多线程应用中被几个任务共享的变量
19.1 一个参数既可以是const还可以是volatile吗?解释为什么。
是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。
它是const因为程序不应该试图去修改它
20. 嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码
,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。
#define mask(0x1<<3)
void Set_bit3(int a)
{
a |= mask;
}
void Clr_bit3(int a)
{
a &= ~mask;
}
21. 嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求
设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写
代码去完成这一任务
这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换(typecast)为一指针是合法的
int *p = (int *)0x67a9;
*p = 0xaa66;
22.中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表事实是,产生了一个新的关键字__interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。__interrupt double compute_area (double radius)
{
double area = PI * radius * radius;
printf(" Area = %f", area);
return area;
}
1). ISR不能返回一个值。如果你不懂这个,那么你不会被雇用的。2). ISR不能传递参数。如果你没有看到这一点,你被雇用的机会等同第一项。3).在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。4).与第三点一脉相承,printf()经常有重入和性能上的问题。
23. 下面的代码输出是什么,为什么?
void foo(void)
{
unsigned int a = 6;
int b = -20;
(a+b > 6) ?puts("> 6") : puts("<= 6");
}
输出为大于6;