C ++中的指针和汇编语言中的指针之间的区别?

时间:2013-01-31 21:16:59

标签: c++ pointers assembly

此外,远近指针......任何人都可以详细说明一下吗?

在C ++中,我不知道指针如何在直接操作码级别或电路级别工作,但我知道它是访问其他内存的内存,反之亦然等。

但是在Assembly中你也可以使用指针。

这里有值得了解的显着差异,还是相同的概念?它是否适用于低级别微处理器特定组件的mneumonics级别?

4 个答案:

答案 0 :(得分:5)

近端和远端指针仅与16位操作系统相关。忽略它们,除非你真的需要它们。您可能仍会在今天的编译器中找到关键字以实现向后兼容性,但它们实际上不会执行任何操作。在16位术语中,near指针是一个16位偏移量,其中内存段已被上下文所知,far指针包含16位段和16位偏移量

在汇编程序中,指针只指向一个内存位置。在C ++中也是如此,但在C ++中,内存可能包含一个对象;根据指针的类型,地址可能会改变,即使它是同一个对象。请考虑以下事项:

class A
{
public:
    int a;
};

class B
{
public:
    int b;
};

class C : public A, B
{
public:
    int c;
};

C obj;
A * pA = &obj;
B * pB = &obj;

pApB不一样!它们将指向C对象的不同部分;将指针从一种类型转换为另一种类型时,编译器会自动进行调整。因为它知道类的内部布局,所以它可以计算出适当的偏移并应用它们。

答案 1 :(得分:1)

通常,指针是允许您访问其他内容的东西,因为它指向它 在计算机中,“某物”和“其他东西”是记忆内容。由于通过指定存储器地址来访问存储器,因此指针(某物)是存储其他东西的存储器地址的存储器位置 在编程语言,高级或汇编程序中,为内存地址指定一个名称,因为名称比内存地址更容易记忆(通常以十六进制数字形式给出)。此名称是常量的名称,对于编译器(高级别)或汇编程序(机器级别)与十六进制数字或存储十六进制数字的变量(内存位置)完全相同。
因此,对于像C ++这样的高级语言或像汇编程序这样的低级语言,指针的概念没有区别。

答案 2 :(得分:0)

近/远:

过去,一些平台,特别是16位DOS和16位Windows,使用了内存段的概念。近指针指向假定的默认段,基本上只是一个偏移量,而远指针包含段部分和偏移部分,因此可以表示内存中的任何地址。

在DOS中,你可以从C / C ++中选择一堆不同的内存模型,其中只有一个数据段,因此所有数据指针都隐含在附近,有几个只有一个代码段,代码和数据指针都很远,等等。

使用细分编程是一个真正的PITA。

答案 3 :(得分:0)

除了大家所说的关于near / far的内容之外:不同之处在于,在C ++中,指针是打字的 - 编译器知道他们指向的是什么,并在幕后为你做一些算术算法。例如,如果您有int *p并访问p[i],则编译器会将{* 1}}的值添加4 * i并访问该地址的内存。那是因为整数(在大多数现代操作系统中)是4个字节长。与结构/类的指针相同 - 编译器将悄悄地计算结构中数据项的偏移量并相应地调整内存地址。

使用汇编内存访问,没有这样的运气。在汇编级别,从技术上讲,几乎没有可变数据类型的概念。具体来说,整数和指针之间几乎没有区别。当您处理大于一个字节的数组时,跟踪数组项长度是您的责任。