c开发面试
1.编程验证大端还是小端
方法一:
void IsBigEndian()
{
short int a = 0x1122;//十六进制,一个数值占4位
char b = *(char *)&a; //通过将short(2字节)强制类型转换成char单字节,b指向a的起始字节(低字节)
if( b == 0x11)//低字节存的是数据的高字节数据
{
// 22 11 hex
//是大端模式
}
else
{
//是小端模式
}
}
方法二:
void IsBigEndian()//原理:联合体union的存放顺序是所有成员都从低地址开始存放,而且所有成员共享存储空间
{
union temp
{
short int a;
char b;
}temp;
temp.a = 0x1234;
if( temp.b == 0x12 )//低字节存的是数据的高字节数据
{
//是大端模式
}
else
{
//是小端模式
}
}
2.int *a[10],int (*a)[10]区别,sizeof(a)
int *a[10]是一个数组指针,a是一个数组,10个int型指针的数组 sizeof(a)=40
int (*a)[10] a是一个指针,指向10个int型的数组 sizeof(a)=4;
3.select和epoll的区别,编写核心的select过程,epoll的两种触发方式
4.memcpy的实现
void *memcpy(char *dst, char * src,unsigned int count)
{
if(dst==NULL || src==NULL)
return;
while(count--){
*dst++=*src++;
}
}
5.C++ vector和list的不同
vector:
vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。
因此能高效的进行随机存取,时间复杂度为o(1);
但因为内存空间是连续的,所以在进行插入和删除操作时,会造成内存块的拷贝,时间复杂度为o(n)。
另外,当数组中内存空间不够时,会重新申请一块内存空间并进行内存拷贝。
list:
list是由双向链表实现的,因此内存空间是不连续的。
只能通过指针访问数据,所以list的随机存取非常没有效率,时间复杂度为o(n);
但由于链表的特点,能高效地进行插入和删除。
6.希尔排序实现
7.gcc的实现步骤
1.预处理,生成预编译文件(Gcc –E hello.c –o hello.i)
2.编译,生成汇编代码(Gcc –S hello.i –o hello.s)
3.汇编,生成目标文件(Gcc –c hello.s –o hello.o)
4.链接,生成可执行文件(Gcc hello.o –o hello)
8.程序内存的分区
代码区:存放函数体二进制代码
全局区:存放全局变量和静态变量
常量区:常量字符串,由系统自动释放
栈区:由编译器自动释放,存放函数的参数值和局部变量值。
堆区:一般由用户释放,存放使用new,malloc申请的变量
9.struct{int a;short b,int c,char d}
struct{int a;short b,char c,int d} 字节对齐
10.complex的+重载
11.斐波那契数列的实现
12.重载和重写的区别:
重载:函数名相同,函数的参数个数、参数类型或参数顺序三者中必须至少有一种不同。函数返回值的类型可以相同,也可以不相同。发生在一个类内部。
重写:也叫做覆盖,一般发生在子类和父类继承关系之间。子类重新定义父类中有相同名称和参数的虚函数。
重写需要注意:
1、 被重写的函数不能是static的。必须是virtual的
2 、重写函数必须有相同的类型,名称和参数列表
3 、重写函数的访问修饰符可以不同。
13.使用宏定义 一年有多少秒
#define 365*24*60*60ul
unsigned long 强制转换,防止溢出