C++:指针语法之间的差异

C++: Difference between pointer syntaxes

本文关键字:之间 语法 指针 C++      更新时间:2023-10-16

好吧,我最近一直在深入研究C++,我正在把一切都记下来。指针终于开始有意义了,我应该在什么时候使用它们,如何正确实现它们,等等。

然而,关于指针的基本使用,还有一个小问题需要回答。我直接跳到代码:

使用以下类A和函数foo(A* bar)

class A
{}
void foo(A* bar)
{}

。。。以下对foo的调用有什么区别

A* a;
A b;
foo(a);
foo(&b);

它们都编译得很好,据我记忆所及,我对它们没有任何问题。

我认为A b;就在那里被实例化了,而A* a;需要用new来创建(因为它实际上还没有创建对象,所以它只是保存了一个4字节长的对潜在A对象的引用)。

如果我想得正确,我可以执行a = b;EDIT使其成为a = &b),然后成功地将a传递给foo。但是,如果我不执行a = &b,而foo尝试读取a指向的(不存在的)对象,这将导致运行时错误。

此外,如果上面的内容是正确的,那么假设我可以很好地成功调用foo(&b);

我说得对吗?

谢谢!

是的,你的理解是正确的。
 foo(&b);

将类型为CCD_ 16的已存在对象的地址作为参数传递给函数CCD_。

foo(a);

传递指向类型CCD_ 18的指针作为函数参数。为了能够做任何有意义的事情,它必须指向一个有效的A对象。可以通过两种方式完成:

正在堆栈上分配对象:
在堆栈(本地存储)上创建类型为CCD_ 20的对象&使指针a指向这个对象:

A* a;
A b;
a = &b;

动态内存分配:

   A *a = new A;

不过,一旦你进行了动态内存分配,你就必须记住在使用后明确释放分配的内存,否则你就会出现内存泄漏:

delete a;

请注意,最好尽可能避免动态分配,如果必须这样做,请使用智能指针而不是原始指针。

您不能执行a = b

必须是a = &b,才能将a设置为b地址。

关于内存管理,您也是正确的:b在堆栈上分配,而a只为指针分配空间,并将创建实际对象留给您。

foo(&b)将工作文件,在初始化*a之前(例如通过a = new A()),foo(a)的行为将是未定义的。

在C++中,指针是一类对象。指针不仅仅是一个需要关联对象才能具有标识的不可见引用。Java/C#引用就是这样工作的(或者说大多数其他语言),但指针本身就是一个对象。

因此A* a声明了一个指针。它不指向任何东西,也没有指向任何东西。如果/当它指向某个东西时,它不需要拥有那个东西。

所以你不需要做a = new A()。你也可以做a = &b(让a包含对象b的地址。或者它也可以指向A类型的任何其他对象。指针只是一个存储地址的对象。关键是你要放弃它"有一个对象"需要创建"的概念。

一个对象,它包含一个地址(或包含特殊值null),如果它包含地址,则该地址可能有也可能没有A类型的对象。

你基本上是正确的。您不应该假设指针是4个字节(例如,在amd64系统上可能是8个)。此外,您的分配应该是a = &b;(注意添加了地址运算符)。除此之外,这听起来很合理。