2015-08-07 4 views
-4

Это может быть дубликат некоторых других вопросов/ответов (которые я не мог найти), но мне кажется, что есть хорошие объяснения , почему и когда использовать многоточечные указатели, но простое объяснение того, как указатель на указатель is разыменованный отсутствует.Разъемы многоуровневых указателей

Я попытался сделать простой (и туманно) объяснение, которое должно только дать читателю наиболее базовые знания о том, как разыменовать указатели на указатели на указатели на ......

ответ

0

Say у вас есть следующий код:

int *p; 
int **p2; 
int k; 

затем мы можем инициализировать k и сделать p точку к нему. После этого мы можем позволить p2точку на указательp:

k = 10; 
p = &i; 
p2 = &p; 

Мы теперь разыменовать p2 дважды, чтобы увидеть, какое значение указатель p2 указывает на указывают на (с использованием простой C++):

#include <iostream> 
... 
std::cout << "What is k? Answer: " << **p2; 

-> Что такое k? Ответ: 10

Также можно изменить значение k разыменовывая это

**p2 = 19; 
std::cout << "What is k now? Answer: " << **p2; 

-> Что такое к сейчас? Ответ: 19

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

int ***p3 = &p2; 
***p3 = 60; 
std::cout << "What is k now? Answer: " << ***p3; 

-> Что такое к сейчас? Ответ: 60

Более подробная информация о том, что на самом деле разыменовании средства можно найти в

What does "dereferencing" a pointer mean?

3

Такое объяснение не должно быть необходимости. Поскольку вы знаете, что * разыскивает указатель, это простая индукция, что, если указательная переменная указана на указатель, вы можете просто разыскивать дважды, чтобы добраться до . Это значение. И так далее.

Не забывайте простое правило: если вы когда-либо нужно более чем в два раза косвенностью (например, найти себе писать *** или хуже), скорее всего ваш дизайн недостатки, и вы должны сделать один шаг назад, переконфигурируйте решение своей проблемы, а затем снова выполните.

+0

Целью было дать понятное объяснение кода чтения, содержащего многоуровневые указатели.Не обязательно то, что вы разработали сами - (поскольку вы должны знать, что такое многоуровневый указатель, прежде чем вы сможете использовать его самостоятельно). – TomBombadil

+1

И я бы все же утверждал, что это не нужно. Учитывая информацию, что '*' разделяет указатель (вместе с тем, что означает * разыменование *), и что указатели могут указывать на другие указатели, любой, кто не способен вывести его, может просто написать '**', не квалифицируется как программист. Но это только мое мнение ... –

+1

Это, безусловно, мнение против мнения, но мой опыт заключается в том, что некоторые новые программисты (которые, как я знаю, часто используют этот сайт) испытывают трудности с пониманием концепции указателей, и это не так редко, что вы спотыкаться о многоуровневых указателях, когда вы изучаете программирование. – TomBombadil

 Смежные вопросы

  • Нет связанных вопросов^_^