1

抱歉这个菜鸟问题,我对 C++ 中指针和引用之间的关系有点困惑。

以下哪项操作在 C++ 中是合法的?

  • 指针指向指针;
  • 指向引用的指针;
  • 引用指针;
  • 参考参考;

我知道指针的指针是完全合法的,即:

int* p;
*p = 5;
int ** pp;
*pp = p;

(我不知道我是否做对了。)

有人可以用一些重要的例子为我澄清这些吗?谢谢你。

4

4 回答 4

4

C++中指针和引用的关系

没有任何。没有关系。他们完全不同。

以下哪项操作在 C++ 中是合法的?

指向指针的指针和对指针的引用。指向引用的指针和对引用的引用不存在。

(我不知道我是否做对了。)

您不是:您发布的代码段调用了未定义的行为(原样),因为您正在取消引用未初始化的指针。

于 2013-07-05T19:19:57.707 回答
0

指针指向:

您展示指针到指针的示例在语义上是正确的,除了您没有为p.

参考指针:

哪有这回事。

引用指针:

对指针的引用与对非指针的引用的行为方式相同。它们允许一个对象通过另一个对象的别名。例如:

int *p = new int;
int *& ref = p;

ref = new int(5);

std::cout << *p; // 5

它们还有助于将指针作为可变参数传递。在 C 中,如果要更改指针的地址,则将其发送给函数:

void f(int **ptr)
{
    *ptr = new int(10);
}

int *p;
f(&p);

在 C++ 中,我们可以简单地使用对指针的引用,所以这不是明确需要的:

void f(int *&ptr)
{
    ptr = new int(10);
}

int *p;
f(p);

参考参考:

哪有这回事。你在想T&&吗?这是一个右值引用,是move-semantics的一个重要方面。

于 2013-07-05T19:25:09.020 回答
0

首先是试图理解基本概念是什么。指针是保存另一个对象地址的变量。引用是另一个对象的别名,即为现有对象创建一个新名称。

这里最重要的是,在引用初始化之后,名称指的是真实对象而不是引用。

考虑到这一点,

你能有一个指向指针的指针吗?

是的,指针是一个保存地址的变量。不同的指针可能保存第一个指针的地址。

你可以参考参考吗?即你可以有一个别名的别名吗?

不,别名代表以另一个名称存在于其他地方的真实对象。您可以创建引用同一对象的新别名,但不能创建别名的别名。

你可以参考一个指针吗?即你可以给指针起别名吗?

是的,您可以引用指针类型的变量。变量包含指针类型或 int 类型的对象这一事实无关紧要,它是一个变量,您可以创建一个别名。

你能创建一个指向引用的指针吗?即你能创建一个指向别名的指针吗?

不,别名只是一个变量的另一个名称,您可以拥有指向原始变量的指针,并且要获得它,您可以使用原始名称或别名,但不能拥有指向别名的指针。

于 2013-07-05T21:32:23.327 回答
0

你可以有:

  • 指向指针的指针:int** i
  • 对指针的引用:int* &i

你不能有:

  • 指向引用的指针
  • 参考参考
于 2013-07-05T19:20:59.187 回答