Разница между `* & p` и` & * p`? - PullRequest
       3

Разница между `* & p` и` & * p`?

0 голосов
/ 26 декабря 2018
int a=10;
int *p=&a;

Теперь, глядя на &*p, мы сначала смотрим на *p, который равен 10, а затем на &10, который является адресом 10 или адресом a

* 1009.* В случае *&p мы сначала смотрим на адрес p, а затем на значение в этом адресе, которое 10

Но я понимаю, что оба *&p против &*pто же самое, почему?

Ответы [ 5 ]

0 голосов
/ 27 декабря 2018

*&p == *(&p).&p - указатель на указатель или int.*(&p) - это значение, на которое указывает указатель, то есть значение p.Чтобы продолжить, **&p выведет «10».

&*p == &(*p), где *p - это значение, на которое указывает указатель (значение a).Теперь & - это адрес a, который снова равен p.И чтобы пойти дальше, *&*p напечатает значение a (10).

0 голосов
/ 26 декабря 2018

По правилу по часовой стрелке / спирали :

Для *&p:

             +-----+
             | +-+ |
             | ^ | |
           * & p ; |
           ^ ^   | |
           | +---+ |
           +-------+
  • Сначала мы возьмем адрес p, которыйнаходится в этот момент адрес адреса a.
  • Тогда мы разыменовываем то, что дает адрес a.

Для &*p:

             +-----+
             | +-+ |
             | ^ | |
           & * p ; |
           ^ ^   | |
           | +---+ |
           +-------+
  • Мы сначала разыменовываем p, что дает нам a.
  • Затем мы берем адрес того, что дает нам адрес a, как и прежде.
0 голосов
/ 26 декабря 2018

В этом контексте & берет адрес (то есть неофициально «добавляет *» к типу выражения).Между тем * разыменовывает указатель (т. Е. «Удаляет *» из типа выражения).Следовательно:

int *p = …;
p; // int *
*p; // int
&*p; // int *
&p; // int **
*&p; // int *

Итак, да, в этом контексте результат тот же: указатель на int, потому что & и * отменяют.Однако, это также то, почему комбинации бессмысленны: результат такой же, как у p.

0 голосов
/ 26 декабря 2018

Рассматривая приведенный ниже пример

int a=10;
int *p=&a;

this

*&p

означает, что здесь и *, и & обнуляются, и это приводит к p, что является ничем иным, как &a.

А это

&*p

означает сначала разыменование p, которое дает a, а затем ссылку &, то есть адрес a, который является ничем иным, как p,так же, как в первом случае.

0 голосов
/ 26 декабря 2018

Давайте нарисуем ваши переменные:

+---+     +---+
| p | --> | a |
+---+     +---+

То есть p указывает на a.

Теперь, если вы сделаете &*p, тогда вы сначала разыменуете pчтобы получить a, тогда вы получите адрес a, который оставляет вас с указателем на a.

Если мы возьмем *&p, тогда вы получите адрес p, чтобы получитьуказатель на p, затем вы разыменовываете этот указатель, чтобы получить p.Это указатель на a.

Так что, хотя выражения делают разные вещи, конечный результат один и тот же: указатель на a.

И компилятор спуска, вероятно, простовообще ничего не делать, так как оператор разыменования * и оператор адреса & вместе всегда взаимно уничтожают друг друга, независимо от того, в каком порядке они находятся.

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