Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
koderman
2 / 2 / 0
Регистрация: 27.11.2012
Сообщений: 131
#1

Указатели (Выделение памяти в куче)

06.01.2013, 22:27. Просмотров 1631. Ответов 17
Метки нет (Все метки)

Чтобы создать в динамически распределяемой памяти переменную типа unsigned short необходимо написать следующее:

unsigned short int*pPointer
Ppointer=new unsigned short int

Свойства динамической памяти выложил на скринах.


А когда создаётся следующий указатель БЕЗ слова new, в каком типе памяти создаётся этот указатель?
int*pAge=0
0
Миниатюры
Указатели (Выделение памяти в куче)   Указатели (Выделение памяти в куче)  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.01.2013, 22:27
Ответы с готовыми решениями:

Потоки и выделение памяти в куче
Подскажите, кто знает, какие есть тонкости при выделении памяти в куче (new) в...

Динамическое выделение памяти. Ошибки в куче
Функция чтения данных из ячейки экселя wchar_t *DataInCell(...

Выделение памяти в куче для строки для реализации длинной арифметики
Доброго времени суток, пишу класс string, на основе которого потом хочу...

Указатели и динамическое выделение памяти
Нужно заполнить массив из 200 элементов числами на промежутке , и найти...

указатели и выделение памяти массивам
дана действительная матрица размером m x n. Определить числа b1, b2, b3.... bn...

17
coloc
погромист
411 / 247 / 30
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
06.01.2013, 22:35 #2
С new мы выделяем память в кучу, на которою указывает этот указатель. А без new указатель инициализируется на стеке.
0
Croessmah
++Ͻ
14543 / 8302 / 1560
Регистрация: 27.09.2012
Сообщений: 20,369
Записей в блоге: 3
Завершенные тесты: 1
07.01.2013, 10:46 #3
Цитата Сообщение от koderman Посмотреть сообщение
в каком типе памяти создаётся этот указатель?
В обоих случаях на стеке функции, в которой он объявлен.
1
koderman
2 / 2 / 0
Регистрация: 27.11.2012
Сообщений: 131
07.01.2013, 11:28  [ТС] #4
Значит разницы межу первым и вторым вариантами нету?
0
Schizorb
510 / 462 / 82
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
07.01.2013, 11:44 #5
koderman, разница может быть в том, на какие данные он указывает.

В первом случае с помощью new выделена память под переменную unsigned short int в куче, и ее адрес присвоен указателю. Сам по себе указатель не в куче, а стековая переменная, просто содержащая чей-то адрес.

Во втором случае просто создан нулевой указатель. Пока он ни на что не указывает, т.е. чей адрес он будет содержать, пока неопределено. Вы сможете присвоить ему адрес какой-нибудь стековой переменной:
C++
1
2
int x;
pAge = x;
Или также выделить память в куче:
C++
1
pAge = new int;
Или присвоить адрес, уже хранящийся в каком-то другом указателе
C++
1
pAge = oldPtr;
1
koderman
2 / 2 / 0
Регистрация: 27.11.2012
Сообщений: 131
07.01.2013, 12:33  [ТС] #6
Не верю.
Первый вариант создаётся в Динамически Распределяемой Памяти это точно. Поэтому и надо после резервирования памяти (new) потом эту память удалять словом delete.
А вот второй вариант наверное в стеке создаётся и стирается сам из памяти как только указатель выходит за пределы видимости программы.
(Я не о присвоении нуля говорил, а вообще об указателях такого вида, без слова new.)
0
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.01.2013, 12:39 #7
Цитата Сообщение от koderman Посмотреть сообщение
Не верю.

Не по теме:

ваше право:D


в приведенном вами коде
Цитата Сообщение от koderman Посмотреть сообщение
unsigned short int*pPointer
Ppointer=new unsigned short int
Цитата Сообщение от koderman Посмотреть сообщение
int*pAge=0
все указатели создаются на стеке
0
koderman
2 / 2 / 0
Регистрация: 27.11.2012
Сообщений: 131
07.01.2013, 12:47  [ТС] #8
Я читаю это в книге. В переводе такие слова перепутать нельзя. На скринах тоже это написано.
0
WhiteP
611 / 209 / 32
Регистрация: 20.11.2012
Сообщений: 435
Завершенные тесты: 1
07.01.2013, 12:48 #9
Указатели - на стеке.
1
Миниатюры
Указатели (Выделение памяти в куче)  
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.01.2013, 12:52 #10
Цитата Сообщение от koderman Посмотреть сообщение
Я читаю это в книге. В переводе такие слова перепутать нельзя. На скринах тоже это написано.
можно и в книге фигу увидить
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void foo()
{
    int* ptr = new int(100500);
}
 
int main()
{
    foo();
/* 
функция foo отработала, указатель ptr утрачен так как он создан на стеке! 
но в динамической памяти все ещё существует занятые нами 4 байта
в которые записано значение 100500
*/
}
1
koderman
2 / 2 / 0
Регистрация: 27.11.2012
Сообщений: 131
07.01.2013, 12:58  [ТС] #11
Ага. Тогда наверное так: Первый вариант создаётся И на стеке и в динамически распределяемой памяти, а второй вариант тот что БЕЗ слова new создаётся только на стеке?
0
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.01.2013, 13:00 #12
Цитата Сообщение от koderman Посмотреть сообщение
C++
1
2
unsigned short int*pPointer 
Ppointer=new unsigned short int
Цитата Сообщение от koderman Посмотреть сообщение
Ага. Тогда наверное так: Первый вариант создаётся И на стеке и в динамически распределяемой памяти, а второй вариант тот что БЕЗ слова new создаётся только на стеке?
именно так, только небольшое уточнение
в динамической памяти создается объект(переменная типа unsigned short int), а затем уже на стеке создается переменная которая сожержит адрес этого объекта
1
Croessmah
07.01.2013, 13:25
  #13

Не по теме:

Цитата Сообщение от koderman Посмотреть сообщение
Не верю.
Тогда смысл спрашивать что-либо?

0
koderman
2 / 2 / 0
Регистрация: 27.11.2012
Сообщений: 131
07.01.2013, 13:51  [ТС] #14
Ну вот опять недопонимание. В конце концов ведь выяснилось совсем другое.
0
Schizorb
510 / 462 / 82
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
07.01.2013, 14:47 #15
koderman, просто поймите, что указатель сам по себе это отдельная переменная, которая хранит адрес другой переменной. При этом располагаться они могут в разных видах памяти.

C++
1
2
int x;
int * ptr = &x;
Указатель ptr - стековая переменная и содержит адрес стековой переменной x.

C++
1
int * ptr = new int;
Сам указатель опять же, создан на стеке, но содержит адрес объекта, созданного в динамически распределяемой памяти.
1
Croessmah
++Ͻ
14543 / 8302 / 1560
Регистрация: 27.09.2012
Сообщений: 20,369
Записей в блоге: 3
Завершенные тесты: 1
07.01.2013, 14:58 #16
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
int main(){
    int var=123;
    int **p=new int*;
    *p=&var;
    std::cout<<**p<<std::endl;
    delete p;
    return 0;
}
Например, для этого кода, связи такие:
Указатели (Выделение памяти в куче)

в данном случае **p выделен на стеке, указатель *p выделен в динамической памяти, переменная var на стеке
0
koderman
2 / 2 / 0
Регистрация: 27.11.2012
Сообщений: 131
09.01.2013, 18:13  [ТС] #17
C++
1
2
3
4
5
6
7
class Rectangle
 
Rectangle* pRect = new Rectangle;
 
const Rectangle * pConstRect = new Rectangle;
 
Rectangle * const pConstPtr = new Rectangle;

Чем отличается это:
C++
1
const Rectangle * pConstRect = new Rectangle;
от этого:
C++
1
Rectangle * const pConstPtr = new Rectangle;
Первое это указатель на объект класса, второе вроде тоже указатель на объект класса? И все переменные которые вызываются с помощью этих объектов не могут менять свои значения.
0
Schizorb
510 / 462 / 82
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
09.01.2013, 18:26 #18
Первое - указатель на константные данные. То есть данные, адрес которых он хранит, изменить не получится.
C++
1
2
const int * ptr = new int(100); 
*ptr = 200; // ошибка, пытаемся модифицировать данные, на которые указывает ptr
Второе - константный указатель. То есть ему не получится присвоить другой адрес.

C++
1
2
int * const ptr = new int(100); 
ptr = new int(200); // ошибка, пытаемся присвоить указателю адрес нового блока памяти
Пример с типом int, с классом аналогично.
1
09.01.2013, 18:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2013, 18:26

Указатели С++. Динамическое выделение памяти
Не пойму, почему перед квадратными скобками нужна звездочка? int **memoryAddr =...

Указатели, выделение памяти для матрицы
Ребята , nомогите nожалуйста , что означают эти заnиси, nросто не могу ни где...

Указатели и функции. Динамическое выделение памяти
1) Напишите программу, которая позволяет вводить динамический одно-мерный...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru