2013-01-31 78 views
2

另外,远近指针......任何人都可以详细阐述一下?C++中的指针与汇编语言中的指针之间的区别?

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

但在大会你也可以使用指针。

是否有任何显着的区别在这里,是值得了解的,或者是同一个概念?它是否适用于低级别微处理器专用组件的肺炎级别?

+0

近和远是过去的(大部分)的事情。指针只是一个内存地址,一个数字。从指针算术 – imreal

+0

除此之外,我知道他们是在存储空间是相同的,只是一个ADRESS。我猜想C中的所有指针本质上都是远指针,但编译器可能会将其优化为接近指针。 – Spidey

+0

C和程序集之间的唯一区别是C指针有一个关联的类型。因此,算术意味着稍微不同的东西(编译器将使用类型信息来确保类型的跨度是正确的)。 –

回答

2

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

0

再远/近:

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

在DOS中,有许多不同的内存模型可以选择用于特定的C/C++,其中只有一个数据段,因此所有数据指针都隐式靠近,几个只有一个代码段,其中代码和数据指针都远的地方,依此类推。

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

6

远近指针只针对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对象的不同部分;当您将指针从一种类型转换为另一种类型时,编译器会进行自动调整。由于它知道班级的内部布局,因此可以计算正确的偏移量并应用它们。

0

除了什么大家都在说关于近/远:不同的是,在C++中,指针类型 - 编译器知道他们是在指指点点,做一些幕后解决算术你。举例来说,如果你有一个int *p和访问p[i],编译器增加了4 *我到p价值,并在该地址访问内存。这是因为一个整数(在大多数现代操作系统中)是4个字节长。与指向结构/类的指针相同 - 编译器将静静地计算结构中数据项的偏移量并相应地调整内存地址。

随着组件存储器访问,没有这样的运气。在汇编层面上,从技术上讲,几乎没有可变数据类型的概念。具体来说,整数和指针几乎没有区别。当你处理大于一个字节的数组时,跟踪数组项的长度是你的责任。