A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李京 中级黑马   /  2012-9-10 08:23  /  3070 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1. 引用与指针有什么区别?
     1) 引用必须被初始化,指针不必。
     2) 引用初始化以后不能被改变,指针可以改变所指的对象。
     3) 不存在指向空值的引用,但是存在指向空值的指针。

2. 堆栈溢出一般是由什么原因导致的?
       没有回收垃圾资源。

3. 什么函数不能声明为虚函数?
       constructor函数不能声明为虚函数。

4. 写出float x 与“零值”比较的if语句。
       if(x>0.000001&&x<-0.000001)

5. 不能做switch()的参数类型是:
      switch的参数不能为实型

6. 头文件中的 ifndef/define/endif干什么用? 预处理
答:防止头文件被重复引用

7. #include <filename.h> 和 #include "filename.h" 有什么区别?
答:
对于#include <filename.h> ,编译器从标准库路径开始搜索filename.h
对于#include "filename.h" ,编译器从用户的工作路径开始搜索filename.h

8. 在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”声明?
答:函数和变量被C++编译后在符号库中的名字与C语言的不同,被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。由于编译后的名字不同,C++程序不能直接调用C 函数。C++提供了一个C 连接交换指定符号extern“C”来解决这个问题。

9.

char str1[] = "abc";
char str2[] = "abc";

const char str3[] = "abc";
const char str4[] = "abc";

const char *str5 = "abc";
const char *str6 = "abc";

char *str7 = "abc";
char *str8 = "abc";

cout << ( str1 == str2 ) << endl;
cout << ( str3 == str4 ) << endl;
cout << ( str5 == str6 ) << endl;
cout << ( str7 == str8 ) << endl;

结果是:0 0 1 1

str1,str2,str3,str4是数组变量,它们有各自的内存空间;而str5,str6,str7,str8是指针,它们指向相同的常量区域。

10.

main()
{
    int a[5]={1,2,3,4,5};
    int *ptr=(int *)(&a+1);
    printf("%d,%d",*(a+1),*(ptr-1));
}

答:2,5

*(a+1)就是a[1],*(ptr-1)就是a[4], 执行结果是2, 5。&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)。int *ptr=(int *)(&a+1); 则ptr实际是&(a[5]),也就是a+5

原因如下:

&a是数组指针,其类型为 int (*)[5]; 而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同; a是长度为5的int数组指针,所以要加 5*sizeof(int)。所以ptr实际是a[5]。但是prt与(&a+1)类型是不一样的(这点很重要),所以prt-1只会减去sizeof(int*)。a,&a的地址是一样的,但意思不一样,a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5]。

11. 交换两个变量的值,不使用第三个变量。即a=3,b=5,交换之后a=5,b=3;

答:有两种解法, 一种用算术算法, 一种用^(异或)

a = a + b;
b = a - b;
a = a - b;

or

a = a^b;// 只能对int,char..
b = a^b;
a = a^b;

or

a ^= b ^= a;

12. 列举几种进程的同步机制,并比较其优缺点。
答:原子操作、信号量机制、自旋锁、管程、会合、分布式系统

13. 进程死锁的原因和4个必要条件
答:资源竞争及进程推进顺序非法;互斥、请求保持、不可剥夺、环路

14. 要对绝对地址0x100000赋值,我们可以用(unsigned int*)0x100000 = 1234; 那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做?

答:*((void (*)( ))0x100000 ) ( );

首先要将0x100000强制转换成函数指针,即: (void (*)())0x100000。然后再调用它: *((void (*)())0x100000)(); 用typedef可以看得更直观些:
typedef void(*)() voidFuncPtr;
*((voidFuncPtr)0x100000)();

15.
unsigned char *p1;
unsigned long *p2;
p1=(unsigned char *)0x801000;
p2=(unsigned long *)0x810000;

请问
p1+5=______;
p2+5=______;

答案:801005;810014。不要忘记了这个是16进制的数字,p2要加20变为16进制就是14

16、设有以下说明和定义:
typedef union {long i; int k[5]; char c;} DATE;
struct data { int cat; DATE cow; double dog;} too;
DATE max;

则语句 printf("%d",sizeof(too)+sizeof(max));的执行结果是:______

答:DATE是一个union, 变量公用空间. 里面最大的变量类型是int[5], 占用20个字节. 所以它的大小是20
data是一个struct, 每个变量分开占用空间. 依次为int4 + DATE20 + double8 = 32.
所以结果是 20 + 32 = 52.

当然...在某些16位编辑器下, int可能是2字节,那么结果是 int2 + DATE10 + double8 = 20

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

7 个回复

倒序浏览
值得学习ing!
回复 使用道具 举报
不错 值得一看
回复 使用道具 举报
感觉对于自学者来说很难
回复 使用道具 举报
初学,表示完全看不懂{:soso_e149:}
回复 使用道具 举报
这是c呢?还是Java啊?
回复 使用道具 举报
有C,也有C++啊
回复 使用道具 举报
挺有用的,以后应该会用上
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马