C+中的指针声明+; 我正在学习C++中的指针。我无法理解指针的声明方式。本书首先在指针变量之前使用星号来初始化指针声明 int *p;

C+中的指针声明+; 我正在学习C++中的指针。我无法理解指针的声明方式。本书首先在指针变量之前使用星号来初始化指针声明 int *p;,c++,pointers,C++,Pointers,之后,需要使用“new”操作符初始化堆中的新变量,然后通过取消引用指针来赋值 p = new int; *p = 45; 书中有一些例子,作者使用以下代码在一条语句中完成所有工作 int *p = new int; *p = 45; 这很令人困惑。我们如何将新的int赋值给*p,因为我们必须将值赋值给*p,就像第一种情况一样 附言:我已经在编译器中测试了第二个用例,它工作起来很有魅力。但是我无法控制它。你想得不对 将*视为类型标识符的一部分 int* p; 这不是一个*p而是一个int*你

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

p = new int;
*p = 45;
书中有一些例子,作者使用以下代码在一条语句中完成所有工作

int *p = new int;
*p = 45;
这很令人困惑。我们如何将新的int赋值给*p,因为我们必须将值赋值给*p,就像第一种情况一样


附言:我已经在编译器中测试了第二个用例,它工作起来很有魅力。但是我无法控制它。

你想得不对

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

int* p;

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

你想得不对

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

int* p;

它不是
*p
而是
int*

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

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是一个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
属于
指向T
的类型,就编译器而言,以下声明是相同的:

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是一个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
属于
指向T的指针类型

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

正如Sam I am在其回答中所说,星号是声明中类型标识符的一部分,如下所示:

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

*p = 45;
因此,为了将这两种含义分开,我建议在声明指针时使用上面使用的语法。与前面提到的其他方法一样,实际上有三种方法可以做到这一点:

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

int *p, *q;
因为下面只会创建一个指针,然后创建一个int:

int* p, q;

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

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

正如Sam I am在其回答中所说,星号是声明中类型标识符的一部分,如下所示:

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

*p = 45;
因此,为了将这两种含义分开,我建议在声明指针时使用上面使用的语法。与前面提到的其他方法一样,实际上有三种方法可以做到这一点:

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

int *p, *q;
因为下面只会创建一个指针,然后创建一个int:

int* p, q;

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

这与
inti=5,除了
int
,您有一个
int*
,而不是5,您分配内存并初始化点