指针澄清

时间:2015-12-10 05:35:42

标签: c++ pointers reference

我试图确保理解一些基本指针配置之间的基本差异。有人会介意解释之间的差异:

GenericTfIdfDocument &gd = d;
GenericTfIdfDocument gd = d; 
GenericTfIdfDocument *gd = &d;

非常感谢任何帮助!

4 个答案:

答案 0 :(得分:1)

如果这是C ++,那么以下内容可能有所帮助:

GenericTfIdfDocument &gd = d;

以上内容声明gd是对GenericTfIdfDocument对象类型的引用,并指定gd来引用d对象。

GenericTfIdfDocument gd = d;

上述内容将gd声明为GenericTfIdfDocument,并将对象d复制到gd

GenericTfIdfDocument *gd = &d;

上述内容声明gd是指向GenericTfIdfDocument对象的指针,并指定gd指向d对象。在这种情况下,gd包含d

的地址

答案 1 :(得分:0)

1)GenericTfIdfDocument& gd = d; // gd是d

的参考

2)GenericTfIdfDocument gd = d; // gd是d ...的副本。

3)GenericTfIdfDocument * gd =& d; // gd是指向d

的指针

情况1:  如果你尝试cout<< & gd<< &安培; d;它们会与gd相同,只是d的别名,它们都有相同的内存地址。

情况2:  cout<< & gd<< &安培; d;它们都会打印不同的内存地址,因为它们都有各自的内存位置。

案例3:  cout<< gd<< &安培; d;有趣的是看到gd存储了d的地址。所以他们都会输出d的内存地址。

cout<< & gd<< &安培; d;你会发现它们都拥有单独的内存位置,但gd值等于d的地址。由于gd与d的类型相同,我们可以说gd指向d,因为它存储了地址。

如果你做cout<< * gd<< d;那么你将获得与gd指向d的输出相同的输出,你做了* gd,就像说d的打印值一样。

答案 2 :(得分:0)

从最简单的开始:

pod

这里你创建了一个名为gd的GenericTfIdfDocument对象,它存储了存储在堆栈某处的值d。因此,变量gd实际上只是堆栈中某个存储器位置的别名,其中存储了d的内容(因为使用别名作为变量名而不是实际的内存位置要容易得多)。

下一步:

GenericTfIdfDocument gd = d; 

这里,gd被声明为指针。变量gd现在是一个别名,用于存储堆栈中包含d值的位置的内存位置。如果您尝试打印gd,它将显示存储变量的内存位置,而不是d的实际值。因此,如果您需要访问变量,则需要使用*运算符(* d)来对其进行处理,以告诉编译器查看该变量所指向的内存单元格的内容。

最后:

GenericTfIdfDocument *gd = &d;

变量gd现在是对d内容的引用。存储内容的方式与创建指针时的工作方式完全相同。除此之外,引用更容易使用且代码更易读,因为当您访问变量时,您不必使用解引用运算符,而只需直接使用名称(gd,而不是* gd)。但是,这些引用和有关重新分配的指针和您可以执行的操作之间存在一些差异等。

答案 3 :(得分:0)

有时代码比单词更清晰,因此有一些代码示例。我替换了int而不是GenericTfIdfDocument,以便更轻松。

示例1

int d = 1;
int gd = d; //d is copied, gd and d are two different variables

d = 3; //setting d
gd = 2; // setting gd

此处d == 3gd == 2。两者都不同,因为一个是另一个的副本。

示例2

int d = 1;
int &gd = d; //gd is a reference of d, it works like an alias

d = 3; //setting d
gd = 2; // gd is a reference(like an alias), so this is the same as d = 2

此处d == 2gd == 2。由于gdd的引用,因此gd == 2d == 2相同。

示例3

int d = 1;
int *gd = &d; //gd is a pointer to d. &d gives you the memory address of d

*gd = 2; //using a bare gd = 2 you're setting the memory address to 2 and we don't now which value is in address 2, in most of case is an invalid value, then you need to derrefence gd with * 

此处d == 2*gd == 2。 * gd类似于参考案例