int a = 3;
а имеет значение 3.
адрес памяти для 0x345A или что-то вроде этого.
А в стеке.
int *p = &a;
указателю p присваивается адрес a. Адрес памяти p равен 0x123B или что-то в этом роде. Этот адрес памяти содержит значение 0x345A, указывающее место, где хранится значение 3
. Указатель p находится в стеке.
Вы получите 3
, если вы напечатаете a
и *p
, поскольку они получают свои значения из одной и той же ячейки памяти.
Вы получите 0x345A
, если вы напечатаете &a
и p
, поскольку адрес a равен значению p.
Вы получите 0x123B
, если вы напечатаете &p
, поскольку это место в памяти для указателя p.
Предполагая, что * c указывает на целое число в куче, вы можете сохранить значение c (которое является адресом памяти целого числа в куче) в массиве.
int *arr = new int[3];
...
arr[2] = c;
То, что вы НЕ хотите делать, это:
int foo = 10;
arr[2] = &foo;
Теперь ваш массив указывает на область памяти, которая находится в стеке. Будет работать нормально, пока вы находитесь в этой функции, но будет указывать на мусор после выхода из функции и восстановления стека.