当前位置:文档之家› IT公司面试题总结(五)

IT公司面试题总结(五)


int **p;//二级指针 &arr;//得到的是指向第一维为100的数组的指针 应该这样写#include<stdio.h> int main(void){ int **p,*q; intarr[100]; q=arr; p=&q; return 0; } 8.写一个内存拷贝函数,不用任何库函数. void *memcpy(void* pvTo,const void* pvFrom,size_tsize) { byte*pbTo=(byte*)pvTo; byte*pbFrom=(byte*)pbFrom; assert((pvTo!=NULL)&&(pvFrom!=NULL)); assert(pbTo>=pbFro+size||pbForm>=pbTo+size); while(size-->0) { *pbTo++=*pbFrom++; } return pvTo; } } 9.将一个数字字符串转换为数字."1234"-->1234 int convert(char*str) { int k=0; while(*str!='\0') { k=k*10+(*str++)-'0'; } return k; } 10.写出运行结果 #include <stdio.h> #include <string.h>
3.求函数返回值,输入x=9999; intfunc(x) { intcountx=0; while(x) { countx++; x=x&(x-1); } return countx; } 结果呢? 知道了这是统计9999的二进制数值中有多少个1的函数,且有 9999=9×1024+512+256+15 9×1024中含有1的个数为2; 512中含有1的个数为1; 256中含有1的个数为1; 15中含有1的个数为4; 故共有1的个数为8,结果为8。 1000-1=0111,正好是原数取反。这就是原理。 用这种方法来求1的个数是很效率很高的。 不必去一个一个地移位。循环次数最少。 4.分析下面的程序 struct s1 { int i:8; int j:4; int a:3; double b; }; struct s2 { int i:8; int j:4; double b; int a:3; };
1.设一棵完全二叉树有700个结点,则在该二叉树中有多少个叶子结点 如果一棵具有n个结点的深度为k的二叉树,它的每一个结点都与深度为 k的满二叉树中编号为1~n的结点一一对应,这棵二叉树称为完全二叉 树。 可以根据公式进行推导,假设n0是度为0的结点总数(即叶子结点 数),n1是度为1的结点总数,n2是度为2的结点总数,由二叉树的性 质可知:n0=n2+1,则n=n0+n1+n2(其中n为完全二叉树的结点总 数),由上述公式把n2消去得:n=2n0+n1-1,由于完全二叉树中度为 1的结点数只有两种可能0或1,由此得到n0=(n+1)/2或n0=n/2, 合并成一个公式:n0=(n+1)/2,就可根据完全二叉树的结点总数计 算出叶子结点数。 700/2=350个叶子节点 2.static数据成员必须在类定义的外部定义。不象普通数据成员,static 成员不是通过类构造函数进行初始化,而是应该在定义时进行初始化。 静态数据成员的用途之一是统计有多少个对象实际存在。 静态数据成员不能在类中初始化,实际上类定义只是在描述对象的蓝 图,在其中指定初值是不允许的。也 不能在构造函数中初始化该成员,因为静态数据成员为类的各个对象共 享,那么每次创建一个类的对象则 静态数据成员都要被重新初始化 #include <stdio.h> class A { public: //A(){i=3;}//不注释掉会出现链接错误 void foo() {printf("%d\n",i); } private: static int i;//如果换成static int i=10;出错 }; int A::i=10;//static变量在类外定义 void main() { A a; a.foo(); }
printf("%d*%d=%d\n",(2),(2),((2)*(2))); MUL里的参数TOW会被展开为(2). 2,当有'#'或'##'的时候 #define A(2) #define STR(s) #s #define CONS(a,b) int(a##e##b) printf("int max:%s\n",STR(INT_MAX));//INT_MAX#include<climits> 这行会被展开为: printf("int max:%s\n","INT_MAX"); printf("%s\n",CONS(A,A));//compileerror 这一行则是: printf("%s\n",int(AeA)); A不会再被展开,然而解决这个问题的方法很简单.加多一层中间转换宏. 加这层宏的用意是把所有宏的参数在这层里全部展开,那么在转换宏里 的那一个宏(_STR)就能得到正确的 宏参数. #define A(2) #define _STR(s) #s #define STR(s) _ STR(s)//转换宏 #define _CONS(a,b) int(a##e##b) #define CONS(a,b) _CONS(a,b)//转换宏 printf("int max:%s\n",STR(INT_MAX));//INT_MAX,int型的最大值,为一 个变量 #include <climits> 输出为:int max:0x7fffffff STR(INT_MAX)-->_STR(0x7fffffff)然后再转换成字符串; printf("%d\n",CONS(A,A)); 输出为:200 CONS(A,A)-->_CONS((2),(2))-->int((2)e(2)) 11:此题考查的是C的变长参数,就像标准函数库里printf()那样. #include<stdarg.h> int ripple(int,...); main() { int num; num=ripple(3,5,7); printf("%d",num);
6.分析一下下面程序的输出结果 #include <iostream.h> #include <string.h> #include <malloc.h> #include <stdio.h> #include <stdlib.h> #include <memory.h> typedef struct AA { int b1:5; int b2:2; }AA; voidmain() { AA aa; char cc[100]; strcpy(cc,"0123456789abcdefghijklmnopqrstuvwxyz"); memcpy(&aa,cc,sizeof(AA)); cout<<aa.b1<<endl; cout<<aa.b2<<endl; } 答案:-16和1 首先sizeof(AA)的大小为4,b1和b2分别占5bit和2bit. 经过strcpy和memcpy后,aa的4个字节所存放的值是: 0,1,2,3的ASC码,即00110000,00110001,00110010,00110011 所以,最后一步:显示的是这4个字节的前5位,和之后的2位 分别为:10000,和01 因为int是有正负之分,所以是-16和1 7.改错: #include<stdio.h> int main(void){ int **p; int arr[100]; p=&arr; return0; } 答案:
int:2/*该2位不能使用*/ intb:3 intc:2 }; 从以上分析可以看出,位域在本质上就是一种结构类型,不过其成员是 按二进位分配的。 5.在对齐为4的情况下分析下面程序的结果 struct BBB { long num; char* name; short int data; char ha; short ba[5]; }*p; p=0x1000000; p+0x200=____; (Ulong)p+0x200=____; (char*)p sizeof(long)=4bytes sizeof(char*)=4bytes sizeof(shortint)=sizeof(short)=2bytes sizeof(char)=1bytes 由于是4字节对齐, sizeof(struct BBB)=sizeof(*p) =4+4+2+1+1/*补齐*/+2*5+2/*补齐*/=24bytes(经Dev-C++验证) p=0x1000000; p+0x200=____; =0x1000000+0x200*24指针加法,加出来的是指针类型的字节长度的 整倍数。就是p偏移sizeof(p)*0x200. (Ulong)p+0x200=____; =0x1000000+0x200经过ulong后,这已经不再是指针加法,而变成一 个数值加法了 (char*)p+0x200=____; =0x1000000+0x200*4结果类型是char*,这儿的1是char的数据类型是1 字节
#define STRCPY(a,b) strcpy(a##_p,#b) #define STRCPY1(a,b) strcpy(a##_p,b##_p) int main(void){ char var1_p[20]; char var2_p[30]; strcpy(var1_p,"aaaa"); strcpy(var2_p,"bbbb"); STRCPY1(var1,var2); STRCPY(var2,var1); printf("var1=%s\n",var1_p); printf("var2=%s\n",var2_p); return0; } 答案:var1=bbbb var2=var1 宏中"#"和"##"的用法 一、一般用法 我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起. 用法: #include <cstdio> #include <climits> using namespace std; #define STR(s) #s #define CONS(a,b) int(a##e##b) int main() { printf(STR(vck));//输出字符串"vck" printf("%d\n",CONS(2,3));//2e3输出:2000 return0; } 二、当宏参数是另一个宏的时候 需要注意的是凡宏定义里有用'#'或'##'的地方宏参数是不会再展开. 1,非'#'和'##'的情况 #defineTOW (2) #define MUL(a,b) (a*b) printf("%d*%d=%d\n",TOW,TOW,MUL(TOW,TOW)); 这行的宏会被展开为:
相关主题