Почему я должен объявлять указатели таким образом? - PullRequest
0 голосов
/ 20 октября 2018

Я практиковался, просматривая чужой код, и не могу понять следующую концепцию:

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

Почему в первом объявлении указателя используется один *, во втором - два, а в третьем - три?Как точно работают указатели и что * делает?

Ответы [ 4 ]

0 голосов
/ 20 октября 2018
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****.

и т. д.

0 голосов
/ 20 октября 2018

Первый указатель - это указатель на int, так что это один *.

Второй указатель - это указатель на указатель на int.Так что 2 **.

То же самое для третьего.

Указатель представляет адрес объекта, в первом случае - адрес int.Тогда вы можете иметь адрес по адресу, указывающему на int.

и т. Д.

0 голосов
/ 20 октября 2018

Если перед именем переменной существует хотя бы одна звездочка, то переменная является указателем.Единственное, что отличает указатель от обычной переменной - это указатели, которые используются только для хранения адреса (переменной).Давайте рассмотрим приведенный ниже пример:

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**.ptr2ptr - это int** тип.
0 голосов
/ 20 октября 2018

* в этом контексте означает, что тип переменной является «точкой».varInt - это int, поэтому ptr2int, указывающий на его адрес, является "указателем на int", или int *.ptr2ptr указывает на адрес ptr2int, так что это «указатель на указатель на int», или int **.ptr2ptr2 указывает на адрес ptr2int, поэтому это «указатель на указатель на указатель на int», или int ***.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...