Я не получаю разницу между целым числом a
и *(&a)
? Я имею в виду, что *(&a)
возвращает значение, содержащееся в адресе a
, и это то же самое, что и a
, нет? Итак, почему использование указателей в этом случае?В чем разница между целым числом a и * (& a)?
ответ
В чем разница между целым числом
a
и*(&a)
?
Без разницы. int a;
объявляет a
как переменную типа int
. &a
- адрес a
имеет тип int *
, то есть тип указателя, и поэтому он может быть разыменован. Таким образом, *(&a)
даст значение a
.
До тех пор, пока a
является переменной, нет никакой разницы, они идентичны.
Однако, если вы используете это выражение в макросе, то оно будет терпеть неудачу с ошибкой компилятора для временных объектов (*&(x+1)
) или литералов (*&5
). Возможно, есть причина сделать это различие в коде.
* Возможно, есть причина сделать это различие в коде *: Что это? – haccks
@haccks Если макрос оценивает выражение дважды, вы хотите, чтобы он не использовался для чего-то, что может иметь побочные эффекты. –
@haccks, я понятия не имею, но я видел много странных маленьких причуд, которые люди используют в своих библиотеках. Boost достаточно, чтобы ваши зубы болели. Кроме того, это единственное, что я могу придумать для рассматриваемой конструкции. – Blindy
Возьмите это в качестве примера,
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)
одинаковы.
Больше, вы обычно не пишите *(&a)
, или *&a
. Это может возникнуть в результате макросов или чего-то другого, но вы обычно никогда не будете писать что-то подобное явно. Вы можете довести это до крайности: *&*&*&*&*&*&a
работает так же хорошо. Вы можете попробовать это:
#include <stdio.h>
int main()
{
int a = 123;
int b = *&*&*&*&*&*&a;
printf("%d\n", b);
return 0;
}
- 1. В чем разница между `* a =` и `= * a`?
- 2. В чем разница между «a» и «a»?
- 3. В чем разница между A a; и A a() ;?
- 4. Какая разница между целым числом a = 5 и новым целым числом (5)?
- 5. В чем разница между a = a + b и a + = b?
- 6. В чем разница между A и A [] в параметре функции?
- 7. В чем разница между «a» и «a» в SML?
- 8. В чем разница между * a и ** a в объекте-c?
- 9. В чем разница между 'a и' _l?
- 10. В чем разница между ++ и a + 1?
- 11. В чем разница между var a = {} и var a = function() {}
- 12. В чем разница между if ($ a) и if ($ a == 1)?
- 13. В чем разница между is-a и has-a?
- 14. В чем разница между списком (a) и [a]?
- 15. В чем разница между * (a + b) и (* a + b)
- 16. В чем разница между static int a и int a?
- 17. В чем разница между $ a == 2 и 2 == $ a?
- 18. В чем разница между «numpy.add (a, b)» и «a + b»?
- 19. Есть ли разница между A a; и A a = A()?
- 20. Разница между «a» и «a: link»
- 21. Разница между адресом переменной и целым числом
- 22. Python - разница между 'a' и "a"?
- 23. Разница между 'a == null' и 'null == a'
- 24. OWL: в чем разница между неотрицательным целым и натуральным числом?
- 25. разница между A aaa; и A aaa();
- 26. Разница между int * a и char * a?
- 27. Разница между a - = b и a = a - b в Python
- 28. Haskell: В чем разница между `Num [a] => a` и` Num a => [a] `
- 29. В чем разница между авто a = A (3) и A a (3)?
- 30. разница между печатью ('a') и 'a'
Не могли бы вы предоставить больше контекста? – personjerry
Единственная причина, по которой это возможно, заключается в том, чтобы предотвратить сохранение хранилища в регистре (поскольку он принят, это невозможно). Это имеет последствия, когда переменная используется без инициализации; это делает его менее опасным. Ср http://stackoverflow.com/a/11965368/3150802. –
Уверен, что он будет оптимизирован. – Blindy