1

此外,远近指针......谁能详细说明一下?

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

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

这里有什么值得了解的显着差异,还是相同的概念?它在低级微处理器特定组件的助记符级别上是否有不同的应用?

4

4 回答 4

5

Near 和 far 指针仅与 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;

pA并且pB不会平等!它们将指向C对象的不同部分;当您将指针从一种类型转换为另一种类型时,编译器会进行自动调整。由于它知道类的内部布局,它可以计算适当的偏移量并应用它们。

于 2013-01-31T21:48:52.563 回答
1

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

于 2013-01-31T21:28:24.490 回答
0

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

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

于 2013-02-01T15:56:15.093 回答
0

重新近/远:

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

在 DOS 中,您可以为 C/C++ 选择一堆不同的内存模型,其中一个只有一个数据段,因此所有数据指针都隐式靠近,有几个只有一个代码段,一个代码和数据指针都很远,依此类推。

分段编程是一个真正的 PITA。

于 2013-01-31T21:35:52.510 回答