1

我正在努力学习一些关于 c++ 中的指针的知识。我无法理解声明指针的方式。本书首先通过在指针变量之前使用星号来初始化指针声明。

int *p;  

之后,需要使用“new”运算符在堆中初始化一个新变量,然后通过取消引用指针来赋值。

p = new int;
*p = 45;

现在书中有一些示例,作者使用以下代码在单个语句中完成所有工作,

int *p = new int;
*p = 45;

这很令人困惑。我们如何将新的 int 分配给 *p,因为我们必须将值分配给 *p,就像在第一种情况下一样?

PS:我已经在编译器中测试了第二种情况,它就像一个魅力。但我无法理解它。

4

3 回答 3

8

你想错了。

*视为类型标识符的一部分。

int* p;

这不是一个*p 它是一个int *

于 2013-08-05T20:58:19.427 回答
6

当我学习指针时,真正让我感到困惑的是星号 (*) 的双重使用。

就像我在他的回答中所说的 Sam 一样,星号是声明中类型标识符的一部分,如下所示:

int* p;

然后,它的另一个用途是解引用运算符,它使您可以访问指针指向的值(在本例中为 int)。这是代码中的第二(或第三)行:

*p = 45;

因此,为了让您自己区分这两个含义,我建议在声明指针时使用上面使用的语法。就像其他人提到的那样,实际上可以通过三种方式完成:

int* p;
int * p;
int *p;

或两者之间的任意数量的空格。但是,我不喜欢中间情况,因为它看起来像乘法之类的。在一行上声明多个指针时需要第三种情况:

int *p, *q;

因为以下只会创建一个指针,然后是一个 int:

int* p, q;

但是不要担心在一行上声明多个指针。如果您不想使用它,您永远不必真正使用它。

于 2013-08-05T21:30:04.480 回答
1

就编译器而言,以下声明是相同的:

int* x; // alternative [1]
int *x; // alternative [2]

选择[1]or是正在进行的宗教战争[2]的风格、偏好和主题的问题。

当您说int* xorint *x时,您已经声明该变量x将存储一个指向整数的指针。您可以稍后传递该指针,如下所示:

int* x;
x = new int;

或立即,如:

int* x = new int;

请注意,如果我在任何一种情况下都写,这都无关紧要int *x。唉,即使int * x是有效的。

有人说您应该更喜欢这种表示法T *x,因为您可以将其读取为*x is a T(而不是将其读取为 (x是指向 ) 的指针T)。其他人更喜欢这种表示法T* x,因为它似乎强调了 x 是类型的事实T*(换句话说,指向 的指针T)。

有人会说该符号T* x可以帮助您避免以下错误:

T *x, y, z; // (x is a pointer to T, but y and z are NOT pointers to T; confusing)

相比之下

T* x, y, z; // (x, y, and z are all pointers to T.

因此,选择您喜欢的符号。但是,出于您的问题的目的,请保留以下问题:当您说T* x您只是说那x是 type 时pointer to T

于 2013-08-05T21:03:31.387 回答