const int *p和int *const p的区别

const int *p;
这里的 p 是一个指向 int 类型 const 对象的指针,const 限定了p指针所指向的对象类型,而并非 p 本身。也就是说,p 本身并不是
const。在定义时不需要对它进行初始化,如果需要的话,允许给 p重新赋值,使其指向另一个 const 对象。但不能通过p 修改其所指对象的值.

int *const p

从右向左把上述定义语句读作“p是指向 int 型对象的const 指针”。与其他 const 量一样,const 指针的值不能修改,这就意味着

不能使p 指向其他对象。任何企图给 const 指针赋值的行为(即使给p 赋回同样的值)都会导致编译时的错误.

在C++中class和struct的区别

            以前老以为有很大的不同,其实也就是默认的的初始化访问级别不同而已,C++默认成员是私有的而 C 默认是公有的。

C++ 是一种静态类型语言:变量和函数在使用前必须先声明。变量可以声明
多次但是只能定义一次。定义变量时就进行初始化几乎总是个好主意。

我心中的C++

如果把我们的对编程语言的需求总结为四个:效率,灵活,抽象,生产率。那么,C语言玩的是前两个,而C++玩的是前三个,Java和C#玩的是后两个(抽象和生产率)

为什么要使用注册窗口类?

为什么要使用注册窗口类?

在一个窗口中,可能有不同的按钮,它们的工作原理都是一样的。但是各个按钮可能都有不同的表现形式,比如大小,颜色等。所以在这种情况下,我们需要将创建窗口的共性提取出来,然后再设置每个具体的窗口。这样就更加符合面向对象的原理。

当应用程序取得消息后,DispatchMessage是如何知道要发给谁去处理呢?

这是因为在注册窗口类时,已经指定了。否则windows不可能知道。

OFFSET 和 ADDR 的异同

OFFSET 和 ADDR 的异同:
1、offset 不能获取局部变量的地址;
2、addr 只能用于调用函数(invoke)时, 不能用于赋值操作;
3、addr 面对局部变量时会转换为 lea 等指令, addr 面对全局变量时则直接调用 offset;
4、在 invoke 中应尽量使用 addr, 其他只用 offset.

CPU直接读取数据的地方

CPU可以直接读写3 个地方的数据:

(1)CPU 内部的寄存器;

(2)内存单元;

(3)端口;

对端口的读写不能用mov、push、pop等内存读写指令。

端口的读写指令只有两条:

in和out,

分别用于从端口读取数据和往端口写入数据。

CPU根据什么将内存中的信息看作指令?

我们可以说,CPU将CS:IP指向的内存单元中的内容看作指令,因为,在任何时候,CPU将CS、IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,执行。如果说,内存中的一段信息曾被CPU执行过的话,那么,它所在的内存单元必然被CS:IP指向过。