Указатели - это целые числа, которые просто указывают позицию в памяти и тип (поэтому они могут указывать только на переменные этого типа).
Так что в ваших примерах все указатели хранятся в стеке (если ониявляются глобальными переменными, но это другой вопрос).То, на что они указывают, находится в куче, как в следующем примере.
void foo()
{
int * ptr = new int(42);
// more things...
delete ptr;
}
Вы можете иметь указатель, указывающий на стек, например, таким образом:
void foo()
{
int x = 5;
int * ptr = &x;
// more things...
}
Оператор '&' получает позицию в памяти переменной x в приведенном выше примере.
nullptr
является типизированным эквивалентом старого NULL
.Они являются способом инициализации указателя на известное и безопасное значение, что означает, что они не указывают ни на что другое, и что вы можете сравнить, являются ли они НЕДЕЙСТВИТЕЛЬНЫМИ или нет.
Программа будет принимать указатели, указывающие настек или куча: это не имеет значения.
void addFive(int * x)
{
*x += 5;
}
void foo()
{
int x = 5;
int * ptr1 = &x;
int * ptr2 = new int(42);
addFive( ptr1 );
addFive( ptr2 );
addFive( &x );
printf( "%d\n", *ptr1 );
printf( "%d\n", *ptr2 );
// more things...
delete ptr2;
}
Единственное отличие состоит в том, что среда выполнения C будет сохранять структуры, сообщающие, сколько памяти было потрачено в куче, и, следовательно, хранение переменных в куче происходитпо стоимости в исполнении.С другой стороны, стек всегда ограничен фиксированным объемом памяти (относительно небольшим), а куча намного больше, что позволяет хранить, например, большие массивы.
Вы можете взглянуть на C-Sim , который имитирует память на C (заявление об отказе: я ее написал).
Надеюсь, это поможет.