我正在研究一下c ++中的指针。我不了解指针的声明方式。本书通过首先在指针变量之前使用星号来初始化指针声明。
int *p;
之后需要使用“new”运算符初始化堆中的新变量,然后通过取消引用指针来赋值。
p = new int;
*p = 45;
现在书中有一些例子,作者使用以下代码在一个语句中完成所有工作,
int *p = new int;
*p = 45;
这令人困惑。我们如何为* p分配一个新的int,因为我们必须将值赋给* p,如第一种情况一样?
P.S:我在编译器中测试了第二种情况,它就像一个魅力。但我无法理解它。
答案 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* x
或int *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
类型。