2015-11-05 9 views
1

Я не получаю разницу между целым числом a и *(&a)? Я имею в виду, что *(&a) возвращает значение, содержащееся в адресе a, и это то же самое, что и a, нет? Итак, почему использование указателей в этом случае?В чем разница между целым числом a и * (& a)?

+5

Не могли бы вы предоставить больше контекста? – personjerry

+0

Единственная причина, по которой это возможно, заключается в том, чтобы предотвратить сохранение хранилища в регистре (поскольку он принят, это невозможно). Это имеет последствия, когда переменная используется без инициализации; это делает его менее опасным. Ср http://stackoverflow.com/a/11965368/3150802. –

+0

Уверен, что он будет оптимизирован. – Blindy

ответ

4

В чем разница между целым числом a и *(&a)?

Без разницы. int a; объявляет a как переменную типа int. &a - адрес a имеет тип int *, то есть тип указателя, и поэтому он может быть разыменован. Таким образом, *(&a) даст значение a.

2

До тех пор, пока a является переменной, нет никакой разницы, они идентичны.

Однако, если вы используете это выражение в макросе, то оно будет терпеть неудачу с ошибкой компилятора для временных объектов (*&(x+1)) или литералов (*&5). Возможно, есть причина сделать это различие в коде.

+0

* Возможно, есть причина сделать это различие в коде *: Что это? – haccks

+0

@haccks Если макрос оценивает выражение дважды, вы хотите, чтобы он не использовался для чего-то, что может иметь побочные эффекты. –

+0

@haccks, я понятия не имею, но я видел много странных маленьких причуд, которые люди используют в своих библиотеках. Boost достаточно, чтобы ваши зубы болели. Кроме того, это единственное, что я могу придумать для рассматриваемой конструкции. – Blindy

0

Возьмите это в качестве примера,

int a = 1; 
int *ptr = &a; 

ptr указывает на какой-то адрес в памяти, а также адрес ptr самого, отличается в памяти.


Теперь взгляните на рисунок ниже,

// *ptr = *(&a) 
// Get the adress of `a` and dereference that address. 
// So, it gives the value stored at `a` 

memory address of  a -> 0x7FFF1234 
value stored at   0x7FFF1234 = 1 

memory address of  ptr -> 0x7FFF4321 
value stored at   0x7FFF4321 = &a = 0x7FFF1234 

              +-------+ 
      +------------> 0x7FFF1234 ---->|a = 1 | 
      |        +-------+ 
      |    +-----------------+ 
      |    | ptr =   |  
      +--*ptr<-------| 0x7FFF1234 [&a] |<--- 0x7FFF4321  
          +-----------------+ 

Таким образом, нет никакой разницы между ними обоими, т.е. int a и *(&a) одинаковы.

0

Больше, вы обычно не пишите *(&a), или *&a. Это может возникнуть в результате макросов или чего-то другого, но вы обычно никогда не будете писать что-то подобное явно. Вы можете довести это до крайности: *&*&*&*&*&*&a работает так же хорошо. Вы можете попробовать это:

#include <stdio.h> 

int main() 
{ 
    int  a = 123; 
    int  b = *&*&*&*&*&*&a; 

    printf("%d\n", b); 

    return 0; 
} 
Смежные вопросы