1. What will be the output of the following C code?
#include
int main(int argc, char* argv[])
{
int b=3;
int arr[] = {6, 7, 8, 9, 10};
int *ptr = arr;
*(ptr++) += 123;
printf("%d, %d ", *ptr, *(++ptr));
return 0;
}
2. 下面程序的结果是多少?
#include
int main(int argc, char* argv[])
{
unsigned char a = 0xA5;
unsigned char b = ~a>>4;
printf("b = %d ", b);
return 0;
}
3. 下面程序的结果是:
#include
int main(int argc, char* argv[])
{
unsigned int a = 0xFFFFFFF7;
unsigned char i = (unsigned char)a;
char * b = (char *)&a;
printf("%08x, %08x ", i, *b);
return 0;
}
4. 用一个表达式,判断一个数X是否为2的N次方(2,4,8,…),不可用循环语句。
5. 下面程序的结果是:
#include
#include
using namespace std;
int main(int argc, char* argv[])
{
int count = 0;
int m = 9999;
while(m){
count++;
m = m & (m - 1);
}
cout << count << endl;
return 0;
}
6. 不用判断语句,找出两个数中比较大的。
7. 如何将a、b的值交互,且不用任何中间变量。
8. 在C++程序中调用被C编译器编译后的函数,为什么要加extern “C”?
9. 头文件中的ifndef/define/endif的作用? #pragma once的作用?
10. 结构体内存对齐问题。
11. 以下代码的输出是?
char var[10];
int test(char var[]){
return sizeof(var);
}
12. 写出下面程序的运行结果。
int a[3];
a[0] = 0; a[1] = 1; a[2] = 2;
int *p, *q;
p = a;
q = &a[2];
cout << a[q - p] << endl;
13. 解释下面这段代码:
int (*a)[10];
a++;
14. 以下程序的输出是:
int a[] = {1, 2, 3, 4, 5};
int *ptr = (int *)(&a + 1);
cout << *(a+1) << endl;
cout << *(ptr - 1) << endl;
15. 什么是智能指针?
16. Please write out the program output.
#include
#include
#define LOOP 1000
int main(int argc, char* argv[]){
int rgnC = 0;
srand((unsigned int)time(NULL));
for (int i=0; i<loop; p="" i++){<="">
int x = rand();
int y = rand();
if (x*x + y*y < RAND_MAX * RAND_MAX)
rgnC++;
}
printf("%d ", rgnC);
return 0;
}
17. 下面程序的输出结果是:
#include
#include
using namespace std;
class Base{
private:
int m_i;
int m_j;
public:
Base(int i):m_j(i), m_i(m_j){ }
Base():m_j(0), m_i(m_j){ }
int GetI(){ return m_i; }
int GetJ(){ return m_j; }
};
int main(int argc, char* argv[]){
Base base(98);
cout << base.GetI() << endl << base.GetJ() << endl;
return 0;
}
18. 请讲述Heap与Stack的差别。
19. 写一个字符串拷贝函数strcpy;为什么strcpy的返回值类型为char *。
20. 如何判断一个单向链表是否有环路?
21. 写出判断ABCD四个表达式的是否正确,若正确, 写出经过表达式中 a的值。
int a = 4;
(A)a += (a++); (B) a += (++a) ; (C) (a++) += a; (D) (++a) += (a++);
22. 下面程序的输出为:
union{
int i;
char x[2];
}a;
int main(int argc, char* argv[]){
a.x[0] = 10; a.x[1] = 1;
printf("%d ",a.i);
return 0;
}
1. 8,8 提示:C中的printf计算参数时是从右到做压栈的。
2. 245 提示:>>的优先级高于~,计算过程中,先将unsigned char转换为int,计算完后再转换为unsigned char。问题:为什么加括号不起作用。
3. 000000f7,fffffff7。
4. !(X&(X-1)) 提示:2、4、8、16这样的数转换成二进制是10、100、1000、10000。如果X减1后与X做与运算,答案若是0,则X是2的N次方。
5. 8 提示:把m转换为二进制,输出为这个二进制中1的个数。
6. int max = ((a + b) + abs(a - b)) / 2
7. a = a ^ b; b = a ^ b; a = a ^ b;
8. C++支持重载,C不支持重载。函数被C++编译后在库中的名字与C语言不同。C++提供了C连接交换指定符号extern “C”解决名字匹配问题。
9. 防止头文件被重复引用。
10. 见文章:结构体内存对齐。
11. 4 因为var[]等价于*var,已经退化成一个指针了,所以大小是4。
12. 2。
13. 本题定义了一个指针指向一个含有10个int元素的数组。a++表示指针向后移动1*sizeof(数组大小),即移动40个字节。
14. 2 5 数组名本身就是指针,再加个&,就变成了双指针,这里的双指针就是二维数组。
15. 智能指针是存储指向动态分配(堆)对象指针的类。除了能够在适当的时间自动删除指向的对象外,它们的工作机制很像C++的内置指针。智能指针在面对异常的时候格外有用,因为它们能够确保正确地销毁动态分配的对象。它们可以用于跟踪被多用户共享的动态分配对象。
16. 大概为250 *π 提示:
概率问题:RAND_MAX是随机数中的最大值,也就是相当于最大班级R。x和y是横纵坐标上的亮点,它们的平方和开根号就是原点到该点的距离。题目退化为:随机在正方形里落1000个点,落在半径里面的点有多少个。
a) 1/4圆面积 = (1/4)*π*R*R
b) 正方形面积 = R*R
c) 两者之比 =π/4
d) 落点数 =π/4 * 1000 = 250 *π≈785
17. 第一个为随机数,第二个为98 提示:初始化列表的初始化变量顺序是根据成员变量的声明顺序来执行的。常量必须在构造函数的初始化列表里面初始化。
18. C/C++的内存区域分为以下几个类别:
a) 栈区(Stack):由编译器分配和释放,存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈。
b) 堆区(Heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能会由操作系统回收。分配方式类似于链表。
c) 全局区(静态区)(static):全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。
d) 文字常量区:常量字符串是放在这里的。程序结束后由系统释放。
e) 程序代码区:存放在函数体的二进制代码。
19. (1)代码如下:
char * strcpy(char * strDest, const char * strSrc){
assert((strDest != NULL) && (strSrc != NULL));
char * address = strDest;
while ((*strDest++ = *strSrc++) != '')
NULL;
return address;
}
(2)为了实现链式表达式,返回具体值。如:
int length = strlen(strcpy(strDest, "Hello world"));
20. 用两个指针,一个步长为1,另一个步长为2,从表头开始一起往前走,如果相遇,表明有环路,否则就是没有了。
{
int i;
T *p = Head, *q = Head;
while ( p != NULL ) {
for ( i = 0; i < STEP1; i ++ ) {
if ( ( p = p->next ) == NULL )
return FALSE;
}
for ( i = 0; i < STEP2; i ++ ) {
if ( ( q = q->next ) == NULL )
return FALSE;
}
if ( p == q ) {
return TRUE;
}
}
return FALSE;
}
21. C错误,左侧不是一个有效变量,不能赋值,可改为(++a) += a;
改后答案依次为9,10,10,11
22. 266 (低位低地址,高位高地址)
结构体内存对齐
一、什么是字节对齐,为什么要对齐?
现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。
对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对 数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那 么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数 据。显然在读取效率上下降很多。
二、请看下面的结构:
struct MyStruct
{
double dda1;
char dda;
int type
[程序员面试宝典总共多少]