C ++中的指针声明

时间:2013-08-05 20:55:15

标签: c++ pointers

我正在研究一下c ++中的指针。我不了解指针的声明方式。本书通过首先在指针变量之前使用星号来初始化指针声明。

int *p;  

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

p = new int;
*p = 45;

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

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

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

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

3 个答案:

答案 0 :(得分:8)

你正在以错误的方式思考它。

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

int* p;

它不是*p它是int *

答案 1 :(得分:6)

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

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

int* p;

然后,它的另一个用途是用于解除引用操作符,它允许您访问指针指向的值(在本例中为int)。这是代码中的第二行(或第三行):

*p = 45;

因此,为了保持这两个意义,我建议在声明指针时使用上面使用的语法。与其他提到的一样,实际上有三种方法可以做到:

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

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

int *p, *q;

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

int* p, q;

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

答案 2 :(得分:1)

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

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

选择[1][2]是一种风格,偏好和正在进行的宗教战争的主题

当您说int* xint *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属于pointer to T类型。