为什么我必须以这种方式声明指针?

时间:2018-10-20 12:14:04

标签: c++ pointers syntax

我一直在通过查看其他代码进行练习,但我无法理解以下概念:

int *ptr2int = &varInt;
int **ptr2ptr = &ptr2int;
int ***ptr2ptr2 = &ptr2ptr;

为什么第一个指针声明使用一个*,第二个使用两个,而第三个使用三个?指针如何正确工作以及*在做什么?

4 个答案:

答案 0 :(得分:3)

第一个指针是指向int的指针,因此就是一个*

第二个指针是指向int的指针。这样2 **

与第三个相同。

指针代表对象的地址,第一种情况是int的地址。然后,您可以将地址指向指向int的地址。

答案 1 :(得分:1)

在此上下文中,*表示变量类型为“点”。
varIntint,因此指向其地址的ptr2int是“指向int的指针”或int *
ptr2ptr指向ptr2int的地址,因此它是“指向int的指针的指针”或int **
ptr2ptr2指向ptr2int的地址,因此它是“指向int指针的指针”或int ***

答案 2 :(得分:1)

如果变量名之前至少存在一个星号,则该变量为指针。使指针与常规变量不同的唯一原因是指针仅用于存储地址(变量)。 让我们看下面的例子:

int     *ptr2int = &varInt; //line 1
int*    *ptr2ptr = &ptr2int;//line 2
int**   *ptr2ptr2 = &ptr2ptr;//line 3

我将星号分开,以便您轻松想象。

  • 在第一行,由于ptr2int之前存在一个星号,因此ptr2int将成为指针,因此ptr2int将用于指向int变量(ptr2int将存储int的地址,在这种情况下为varInt的地址。)
  • 在第二行,因为在ptr2ptr之前存在一个星号,所以ptr2ptr将成为指针,但是该指针与第一行的指针不同,因此将使用此行的指针指向int*变量(int*变量的地址,在这种情况下为ptr2int的地址)。
  • 对于第三行,依此类推,因为在ptr2ptr2之前存在一个星号,所以它是一个指针,并且该指针将用于存储int**变量的地址。 ptr2ptrint**类型。

答案 3 :(得分:0)

int i = 0; // integer type

如果要指向指向i,我需要一个指向整数的指针类型:

int* ip; // pointer to integer type

如果我想指向ip,我需要一个指向(指向整数的指针)类型的指针:

int** ipp; // pointer to (pointer to integer) type

这是必需的,因为ip的类型为int*。因此,指向该指针的指针int**

每当需要指针给定类型时,就在声明中使用*。即使该类型已经已经是指针类型。

所以要指向一个值,您需要int*

因此要指向指向值的指针,您需要int**

因此,要指向指向值的指针的指针,您需要int***

因此,要指向指向值的指针的指针,需要int****

等...