1.const的作用是什么?
第一,限定一个只读变量(不是常量)。如const double PI = 3.14第二,限定函数参数,如,void function(const char *p) //函数只能读取不能改变p的值
2.关键字volatile有什么含意?
volatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错
3.嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。
1、把a的bit3赋值为1 a |= (0x01<< 3);//a或等于1左移3位,这样保证其他的位不变,bit3被赋值为1 2、把a的bit3清除 a &= ~(0x01<< 3);//a与等于(1左移3位之后取反),这样保证其他的位不变,bit3被清除
4.用typedef自定义的数据类型?
1,用来定义一种类型的别名,这样,可以用它来连续定义变量,而不是简单的宏替换,比如:typedef char* PCHAR;PCHAR pa, pb; 2,在C时代,定义了一个结构体之后,再使用的时候还要加上struct关键字才能用来定义变量,这样会比较麻烦,而使用typedef来定义之后,就可以不用写struct关键字了,比如:typedef struct tagPOINT { int x; int y; }POINT; POINT p1;当然,,C++里可以不用这样,因为C++使用结构体的时候不需要加struct关键字3,用typedef来定义与平台无关的类型。比如你有一个跨平台的项目,需要统一使用一种双精度浮点型的类型,而在一些平台上可能没有这种实现,或者实现不同,这时候你就可以根据不同的平台来定义你自己的类型4,用来使复杂的定义简单化,最常用的就是给函数指针定义一个别名所以,总的来说,typedef并不是“发明”了另外一种新类型,而相当于是一种类型的别名,为了方便使用。
5.sizeof是一个运算符,运算结果是类型的大小(内存字节数);
strlen()是一个函数,返回值为一个字符串的长度.
6.写出short ,char ,unsigned char的表示范围?
1字节=8个位
在32位系统中一个char类型一般为8个bit,所以能存储的数据范围为-128~127,而unsigned char则是0~255,字符型所存储的数据是用来表示字符的,例如ASCⅡ或Unicode。signed char的范围是-127到127.short -32767 ~ + 32768 (2 Bytes)
7.编写一个strcpy()函数?10分
void strcpy( char *strDest, char *strSrc )
{
while( (*strDest++ = * strSrc++) != "\0");
} (4分)
另一种:
//为了实现链式操作,将目的地址返回,加3分!
char * strcpy( char *strDest, const char *strSrc )
{
assert( (strDest != NULL) &&(strSrc != NULL) );
char *address = strDest;
while( (*strDest++ = * strSrc++) != ?\0? );
return address;
}
8.内存的分配方式有几种,他们的区别,各举例。
1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。 2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。 3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由程序员决定,使用非常灵活,但问题也最多。
9.const的用法,以及声明const变量与宏的区别。
const的用法有四种:参数、返回值、函数,用const修饰变量将限定变量为只读,该变量值不允许被改变。使用const还可以节省内存空间。
define:定义预编译时处理的宏; 只进行简单的字符替换,无类型检测 const:定义程序中的常量,编译时处理; 常量修饰符,把变量定义为常量。
10.static有什么用途?(至少说明两种)
1) 限制变量的作用域 2) 设置变量的存储域
11.队列和栈有什么区别?
栈(Stack)是限定只能在表的一端进行插入和删除操作的线性表。队列(Queue)是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。从"数据结构"的角度看,它们都是线性结构,即数据元素之间的关系相同。但它们是完全不同的数据类型。除了它们各自的基本操作集不同外,主要区别是对插入和删除操作的"限定"。栈和队列是在程序设计中被广泛使用的两种线性数据结构,它们的特点在于基本操作的特殊性,栈必须按"后进先出"的规则进行操作,而队列必须按"先进先出"的规则进行操作。和线性表相比,它们的插入和删除操作受更多的约束和限定,故又称为限定性的线性表结构。
12.写出冒泡排序代码:
13.c指令及用途:
14.sizeof及strlen区别:
sizeof定义:sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数
sizeof是一个运算符,运算结果是类型的大小(内存字节数);
strlen()是一个函数,返回值为一个字符串的长度
Strlen:strlen所作的仅仅是一个计数器的工作,它从内存的某个位置开始扫描,直到碰到第一个字符串结束符‘\0‘为止,然后返回计数器值。
15.写出short ,char,unsigned char的表示范围?
16.(单片机)STM32的IO八种配置模式:
17.C指针的应用:
1.一些高级声明:
1) int *f( void);
f是一个函数,返回值类型是一个指向整型的指针。
2) int (*f) (void );
f是一个函数指针,它所指向的函数返回值类型是一个整型值。
3) int *(*f) (void );
f是一个函数指针,它所指向的函数返回值是一个整型指针,只有对其进行间接访问,才能得到一个整型值。
4) int *f[ ];
f是一个数组,它的元素类型是指向整型的指针(指针数组)。
5) int (*f[ ]) (void );
f是一个数组,数组元素的类型是函数指针,它所指向的函数返回值是整型值。
6)int *(*f[ ]) (void );
f是一个数组,数组元素的类型是函数指针,它所指向的函数返回值是指向整型的指针。
2. 函数名被使用时总是由编译器把它转换成函数指针。
18.(硬件)选择电阻时要考虑什么?
选择电阻是需要考虑电阻的功率 阻值 允许加载在其两端的最大电压 允许通过的最大电流 等等.
19.(单片机)单片机上电后没有运转,首先要检查什么?
1)电源,查看单片机各引脚电压值是否正确
2)查看晶振是否正常工作,可以用示波器查看
3)查看最小系统有无接错,断路等毛病,用万用表。
20.(linux)简述嵌入式Linux系统的初始化过程。
嵌入式Linux系统开机首先运行BootLoader,然后由BootLoader引导启动内核,由内核检查和初始化硬件设备,载入设备的驱动程序模块,安装root文件系统,然后内核将启动一个名为init的进程(2分)。在init运行完成并启动其它必要的后续进程后,系统开始运行,引导过程结束。init进程启动时需要读取inittab配置文件,该文件确定init在系统启动和关机时的工作特性。