面的C++,先不说别人面试官怎么样吧,自己就不行了。。。
面试给了三道题
一.假设数组的起始地址是0x100问以下代码各输出了什么
int a[5];
printf("%x\n",a);//输出的是16进制的数字,%x输出16进制,%d输出10进制,%o输出8进制。C/C++不直接支持二进制的输出(C++要输出二进制可用bitset)
printf("%x\n",a+1);
printf("%x\n",&a);
printf("%x\n",&a+1);
printf("%x\n",*a);
printf("%x\n",*a+1);
在vs-32位-debug下输出的内容应为()
100
104
100
114
cccccccc
cccccccd
分析可以看出,1.数组名代表数组的起始地址,同时也是第一个元素的地址。
2.数组名+一个数字,数组名此时相当于一个int类型的指针变量(如果数组是char数组,那么这时候就相当于一个char类型的指针变量),+数字就表示向后移动数字*4位(在32位系统int占4个字节)后的地址。
3.对数组名取地址,想当于把整个数组都取了,所以+1,则是移动整个数组的地址。
4,*a表示指针指向地址的数据。在debug下,一个未初始化的int类型数组的初值为0xcccccccc。如果是char类型的数组,输出会是ffffffcc。为什么会是cc,我百度过,原来是因为中断指令int3的编码正是cc,所以当程序代码读到有错时,能及时通过int3将程序交给调试程序。这样在我们调试程序时,当看到出现cc的时候,可以大致断定自己定义了的变量没有初始化了。
二.第二个问题是问结构体大小的计算,只懂字节对齐的我,了解的并不深入。
详细可以参考:http://www.cnblogs.com/0201zcr/p/4789332.html 这篇文章讲得不错
求结构体大小有两个最重要的规则,1.每一个变量的偏移值都都必须是该变量的大小的整数倍,偏移值就是指变量离第一个变量的地址偏移。
2.结构体最终大小,应该是任意一个变量大小的整数倍。
3.如果结构体中有嵌套有结构体,嵌套的结构体必须展开处理,结构体的大小必须是所有成员大小的整数倍,而不是结构体单独当作是一个成员。
4.嵌套结构体的第一个变量的偏移值为整个嵌套结构体中最大变量大小的整数倍。
结合上面的规则,计算结构体大小的步骤就是:1.从第一个变量开始,第一个变量的偏移值恒定为0。
2.往下计算下一个变量的偏移值,下一个变量的偏移值为,上一个变量的偏移值+上一个变量的大小。
3.判断偏移值是否为变量大小的整数倍,若是的话,那么该变量的上一个变量所占的空间就是它自身的大小。然后继续计算下一个变量的偏移值。
若不是的话,则要对上一个变量的后面进行补字节,补充到刚好使偏移值为变量大小的整数倍为止。此时上一个变量所占的空间就变为自身大小+补齐的字节数
4.在计算到最后一个变量后,要对整个结构体大小进行计算,若大小不是最大变量的整数倍,则在最后一个变量后面补齐字节,此时最后一个变量所占空间就为变量本身大小+补齐字节数
5.计算每个变量所占空间大小则为结构体大小。
例1:
struct A
{
int a;
char b;
int c;
char d;
}
1.首先计算a的大小,a的偏移值是0,规定0是任何数的整数倍,所以a所占空间就是它自身4字节.
2.计算b的偏移值为0+4=4(上一个变量的偏移值+所占空间),char类型是1个字节的,4为1的倍数,所以char现在占的空间是1字节。
3.计算c的偏移值为4+1=5,int类型是4个字节的,显然5不是4的倍数,那么就要给上一个变量后面补齐字节了,8是4的倍数,所以上一个变量的空间就要补上3个字节。现在上一个变量b的空间由1变成了4。我们再去计算c的偏移值,4+4=8,这时就符合规则了。
4接着计算d的偏移值,8+4=12,12为1的倍数,所以c现在所占的空间为1。
5.最后计算各个变量所占空间的总和,4+4+4+1=13。13不满足规则2,因为13不是4的倍数,那么就要在最后一个变量后面补齐3个字节。此时d所占空间就变成4了。
6再计算一遍各个变量的总和,4+4+4+4=16,所有规则都符合了,所以这个结构体的大小就是16.
例2:
struct stu5 struct
{ {short a //2+2 char b; //1+1
struct short c; //2
{ int d; //4
char b; //1+1 } //8
short c; //2
int d; //4
} ss;
char e; //1+3
};
1.short的偏移值为0,大小为2,所以开始时占用空间为2
2.顺序往下,计算结构体。结构体中最大的变量为int类型,所以嵌套结构体中第一个变量的偏移值必须为4的倍数,于是往a的后面补齐2个字节。
3.按照规则依次往下计算,就是先计算偏移值,判断偏移值是不是自身的倍数,不是得话就在上一个变量后端补齐,是的话就直接下一个。
4.计算完最后一个变量后,要计算总大小是不是每一个变量的整数倍,这个时候要注意,结构体是展开来计算的,不能将结构体单独计算为一个变量。
这里总大小不应该是嵌套结构体大小8的倍数,而是所有变量中最大的int的4的倍数。
三.第三道是问时间复杂度的问题
- - 参考另一篇自己的总结,面试的时候忘得差不多了 。 http://blog.csdn.net/a512745183/article/details/52457630
面试总结:基础一定要打牢,不仅是笔试的筹码也是面试的筹码。多看看自己的笔记,多留意细节的地方,多练习,多尝试,这样记忆才会深刻。还有要淡定!!!