C ++ - * p против & p против p - PullRequest
       3

C ++ - * p против & p против p

4 голосов
/ 12 марта 2012

Я все еще пытаюсь понять разницу между * p, & p и p.Из моего понимания * можно думать о «значении, на которое указывает», и & как о «адресе»Другими словами, * содержит значение, а & держит адрес.Если это правда, то в чем разница между * p и p?Не содержит ли p значение чего-либо, как * p?

Ответы [ 5 ]

7 голосов
/ 12 марта 2012

Оператор * используется для косвенного обращения.Косвенное направление означает, что значение в p интерпретируется как адрес памяти, а значение по этому адресу загружается.p - это значение p, а *p - это значение, сохраненное в ячейке памяти, на которое указывает p.Если вы хотите получить косвенный доступ к значению целого числа i, вы можете указать на него целочисленный указатель (int *p = &i) и использовать этот указатель для косвенного изменения значения i (*p = 10).

5 голосов
/ 12 марта 2012

Вот диаграмма.

  &p=0xcafebabe        p=0xfeedbeef         *p=0xdeadbeef    <-- memory address

+--------------+    +---------------+    +----------------+
| p=0xfeedbeef | -> | *p=0xdeadbeef | -> | **p=0x01234567 |  <-- memory contents
+--------------+    +---------------+    +----------------+

Итак, &p - это адрес p, то есть 0xcafebabe.В ячейке памяти 0xcafebabe хранится значение p, p, которое равно 0xfeedbeef.Это также адрес *p.

Так повторяйте за мной: значение p является адресом *p.

И значение &p равноадрес p.

А, значение *p является адресом **p.

и т. д. и т. п.Так что * и & похожи на противоположности и *&p == p == &*p, если только вы не делаете смешные вещи с перегрузкой оператора.

1 голос
/ 12 марта 2012

Я приведу вам пример: int q=12; int *p=&q; int *pp; pp=&q;

Технически * и & ничего не содержат, поскольку они оба работают с переменными. * извлечет значение, а & извлечет адрес. Лучший способ откопать магию указателей - отладить.

0 голосов
/ 20 января 2018

Что такое указатель?

Любая переменная находится по адресу в памяти, и этот адрес содержит значение с размером (некоторые байты 2 (16 бит), 4 (32 бита), 8 (64 бита))).Когда значение этой переменной является значением адреса, мы называем эту переменную указателем.

Я надеюсь, что это объяснение указателей поможет некоторым лучше понять.Рисунок, подобный , этот помогает понять оператор ++ или - при перемещении указателя.Значение переменной указателя увеличивается или уменьшается, поэтому адрес, на который указывает указатель (указанная ячейка памяти), перемещается вверх или вниз в user3231318 представление выше

0 голосов
/ 26 декабря 2016
          **Adress|Data**
          00001   |12345-----|
          00002   |45678     |
          12345   |99887 <---|-------|
          6757    |33431             |
          9987    |22894<------------|

          Print(&p)----->00001
          Print(p)------>12345
          print(*P)----->99887
          Print(**p)---->22894
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...