嵌入式软件工程师面试(1)
1、int a[10]={1,2,3,4,5,6,7,8,9,0};
int *p=&a[1];
则p[6]等于8
2、整数数组清零
- bzero函数
函数原型:void bzero(void *s, int n);
功能:将字符串s的前n个字节置为0,一般来说n通常取sizeof(s),将整块空间清零。
char str[10];
bzero( str, sizeof(str) );
或者:
struct node
{
char a;
int str[4];
double b;
};
struct node Test;
bzero( &Test, sizeof(Test) );
- memset函数
函数原型:void *memset(void *s,int c,size_t n);
功能:将s中前n个字节替换为c并返回s
//同上将str清零:
memset( str,0,sizeof(str) );
//将上面的Test变量清零:
memset( &Test,0,sizeof(Test) );
3、sizeof() 与strlen()
- strlen()
strlen()是函数,用于计算字符串数组的实际长度(到‘\0’结束,不包含‘\0');strlen只能用于计算char *a或char a[]格式的。
#include <stdio.h>
#include <string.h>
int main(int argc,char **argv)
{
char a[10]; //未初始化,长度不确定
char b[10]={}; //初始化为’空,NULL;长度为0,
char c[10]="abc"; //遇到’\0‘结束,实际长度为3
char d[10]="abc\0def"; //遇到’\0‘结束,实际长度为3
char *e="abc"; //遇到’\0‘结束,实际长度为3
printf("%d\n%d\n%d\n%d\n%d\n",strlen(a),strlen(b),strlen(c),strlen(d),strlen(e));
return 0;
}
- sizeof
sizeof是操作符,计算的是所占内存的实际长度,单位是字节,可用于常量,变量,数据类型,函数,sizeof是基于数据类型来计算长度的。
#include <stdio.h>
#include <string.h>
int main(int argc,char **argv)
{
char a[10]; //char类型长度为1,包含10个char类型的数组长度为10
char b[10]={};
char c[10]="abc";
char d[10]="abc\0def";
char *e="abcde";
printf("%d\n%d\n%d\n%d\n%d\n",sizeof(a),sizeof(b),sizeof(c),sizeof(d),sizeof(e));
return 0;
}
注意:
sizeof是操作符,计算的是所占内存的实际长度,单位是字节,可用于常量,变量,数据类型,函数,sizeof是基于数据类型来计算长度的
4、
main()
{
char *str[]={"ab","cd","ef","gh","ij","kl"};
char *t;
t=(str+4)[-1];
printf("%s",t);
}
//则显示"gh"
5、小端与大端
小端:低位字节数据存储在低地址
大端:高位字节数据存储在低地址
例如:
int a=0x12345678;(a首地址为0x2000)
0x2000 0x2001 0x2002 0x2003
0x12 0x34 0x56 0x78 大端格式
可以利用联合体union判断大小端
#include<stdio.h>
int main()
{
union Test
{
unsigned int a;
unsigned char b;
}tmp={0x12345678};
//如果打印出的是0x78,表明是litter-endian
//如果打印出的是0x12,表明是big-endian
if(tmp.b==0x78)
printf("The endian of cpu is litter.\n");
else
printf("The endian of cpu is big.\n");
return 0;
}
6、异步IO和同步IO区别
如果是同步IO,当一个IO操作执行时,应用程序必须等待,直到此IO执行完,相反,异步IO操作在后台运行, IO操作和应用程序可以同时运行,提高系统性能,提高IO流量; 在同步文件IO中,线程启动一个IO操作然后就立即进入等待状态,直到IO操作完成后才醒来继续执行,而异步文件IO中,线程发送一个IO请求到内核,然后继续处理其他事情,内核完成IO请求后,将会通知线程IO操作完成了。
7、用变量a定义
- 一个整型数 int a;
- 一个指向整型数的指针 int *a;
- 一个指向指针的指针,它指向的指针式指向一个整型数 int **a;
- 一个有10个整型数的数组 int a[10];
- 一个有10指针的数组,该指针是指向一个整型数 int *a[10];
- 一个指向有10个整型数数组的指针 int (*a)[10];
- 一个指向函数的指针,该函数有一个整型数参数并返回一个整型数 int (*a)(int);
- 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型数参数并返回一个整型 int (*a[10])(int);
8、
int foo(void)
{
int i;
char c=0x80;
i=c;
if(i>0)
return 1;
return 2;
}
返回值为2;因为i=c=-128;如果c=0x7f,则i=c=127。
9、a=b*2;a=b/4;a=b%8;a=b/8*8+b%4;a=b*15;效率最高的算法
a=b*2 -> a=b<<1;
a=b/4 -> a=b>>2;
a=b%8 -> a=b&7;
a=b/8*8+b%4 -> a=((b>>3)<<3)+(b&3)
a=b*15 -> a=(b<<4)-b
注意:当 lenth = 2^n 时,X % length = X & (length - 1)
10、c关键字
c的关键字共32个
(1)数据类型关键字(12)
char,short,int,long,float,double,unsigned,signed,union,enum,void,struct
(2)控制语句关键字(12)
if,else,switch,case,default,for,do,while,break,continue,goto,return
(3)存储类关键字(5)
auto,extern,register,static,const
(4)其他关键字(3)
sizeof,typedef,volatile