Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.73
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
#1

Динамическое выделение - C++

26.08.2009, 21:56. Просмотров 2694. Ответов 44

Если кто может,дайте расшифровку этому:
C++
1
2
3
4
pprime = new long[max];
    *pprime = 2;
    *(pprime + 1) = 3;
    *(pprime + 2) = 5;
этому:
C++
1
    found = (trial%*(pprime + i)) == 0;
этому:
C++
1
2
    if(found == 0)
        *(pprime + count++) = trial;
и этому:
C++
1
delete [] pprime;
из этого кода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <iomanip>
using namespace std;
 
int main()
{
    setlocale(0,"Russian");
    long* pprime = 0;
    long trial = 5;
    int count = 3;
    int found = 0;
    int max = 0;
 
    cout<<endl
        <<"Введите количество простых чисел которые хотите получить (минимум 4):";
    cin>>max;
    if(max<4)
        max = 4;
 
    pprime = new long[max];
    *pprime = 2;
    *(pprime + 1) = 3;
    *(pprime + 2) = 5;
do
{
    trial+=2;
    found = 0;
    for(int i = 0; i < count; i++)
    {
        found = (trial%*(pprime + i)) == 0;
        if(found)
            break;
    }
    if(found == 0)
        *(pprime + count++) = trial;
}while(count<max);
 
for(int i = 0; i < max; i++)
{
    if(i%5 ==0)
        cout<<endl;
        cout<<setw(10) << *(pprime + i);
}
delete [] pprime;
pprime = 0;
cout<<endl;
 
cin.ignore();
cin.get();
}
Просто по книге не описуются детали этих строк, сижу минут 30, не могу въехать,что они делают. Желательно было бы объяснить весь код.
Благодарю за терпение.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.08.2009, 21:56     Динамическое выделение
Посмотрите здесь:

динамическое выделение - C++
совсем запуталась в динамическом выделение памяти.. подскажите,верно ли решено?? #include &lt;iostream&gt; #include &lt;stdio.h&gt; ...

Динамическое выделение памяти - C++
Выполнить задание используя динамическое выделение памяти: Данная целочисленная прямоугольная матрица. Определить: -количество строк,...

Динамическое выделение памяти - C++
Использовать динамическое выделение памяти для программы : #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;iomanip&gt; #include...

Динамическое выделение памяти - C++
Имеется такая вот задача ! Нужно сделать что бы память выделялась динамически,а не на этапе компиляции!!! Какие будут предложения ??? ...

Динамическое выделение памяти - C++
Уважаемые программисты!!!! Подскажите как выделить память для двумерного массива. Заранее спасибо!!!

Динамическое выделение памяти - C++
Добрый день. Возник вопрос: Как мне узнать адрес последнего байта в выделенной памяти? Я выделил память (массив нулей и единиц): ...

Динамическое выделение памяти - C++
Всем привет. Научите, пожалуйста, правильно пользоваться динамическим выделением памяти. Допустим, у меня есть функция, где я пытался...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
26.08.2009, 22:01     Динамическое выделение #2
прочтите в той же книге что такое указатели (pointers) и управление памятью. если в ней этого нет - возьмите другую книгу, где этого есть.
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
26.08.2009, 22:02     Динамическое выделение #3
Цитата Сообщение от Golovastik Посмотреть сообщение
Код
pprime = new long[max];
	*pprime = 2;
	*(pprime + 1) = 3;
	*(pprime + 2) = 5;
- выделение памяти под массив на max элементов типа long
- в первую ячейку массива пишем 2
- pprime+n вычисление указателя на n-ый элемент массива

дальше терпелка кончилася
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
26.08.2009, 22:14  [ТС]     Динамическое выделение #4
Пожалуйста,кто может, дайте расшифровку немного дальше.
M128K145
Эксперт С++
8283 / 3502 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
26.08.2009, 22:22     Динамическое выделение #5
C++
1
2
3
4
5
pprime = new long[max]; // динамическое выделение памяти под max элементов
    *pprime = 2; // первому элементу присваивается значение 2 (*pprime - указатель)
    *(pprime + 1) = 3; // второму эл. - 3(запись *(pprime + 1) означает смещение относительно
           // начала на + 1 элемент)
    *(pprime + 2) = 5; // аналогично 3 строке
C++
1
2
found = (trial%*(pprime + i)) == 0;// присвоение переменной found значения 1(истина), если
// остаток от деления trial на *(pprime + i) равен 0, иначе 0(ложь)
C++
1
2
3
if(found == 0) // если found равен 0, то 
    *(pprime + count++) = trial; // присвоение по адресу*(pprime + count) значение trial и
           // после этого увеличение счетчика на 1
C++
1
delete [] pprime; // освобождение динамически выделеной памяти
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
26.08.2009, 22:43  [ТС]     Динамическое выделение #6
Спасибо. Меня ещё интересует вот эта строка:
C++
1
    pprime = new long[max];
Это вроде и не масив, потому что масив имеет имя и и тип и индекс, а тут тип и индекс? Чо-то не врубаю.
Дайте пожалуйста полное расшифрование этой строки.
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
26.08.2009, 22:47     Динамическое выделение #7
Golovastik, это динамическое выделение памяти под массив. Выделяется память под массив типа long размером max и возвращается указатель на эту область (а именно на первый его элемент).
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
26.08.2009, 22:57  [ТС]     Динамическое выделение #8
А название масива определяется тогда вот этой строкой:
Код
long* pprime = 0;
Если масив,тогда он должен иметь имя. Оно определяется указателем на лонг. И получается что имя масива pprime состоящий из элементов [max]
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
26.08.2009, 23:03     Динамическое выделение #9
Цитата Сообщение от Golovastik Посмотреть сообщение
Если масив,тогда он должен иметь имя. Оно определяется указателем на лонг. И получается что имя масива pprime состоящий из элементов [max]
Фактически да. Вообще, статический массив - это указатель на первый элемент массива.
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
26.08.2009, 23:33  [ТС]     Динамическое выделение #10
Имя масива(динамического) - это указатель на первый элемент масива?
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
26.08.2009, 23:35     Динамическое выделение #11
Да.
Rififi
2338 / 1053 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
26.08.2009, 23:39     Динамическое выделение #12
Цитата Сообщение от Golovastik Посмотреть сообщение
Имя масива(динамического) - это указатель на первый элемент масива?
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
Да.
А теперь - правильный ответ (:
Имя массива - это НЕ указатель на его первый элемент.
Книги, в которых утверждается иное, можно использовать для полее полезных действий
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
27.08.2009, 00:09     Динамическое выделение #13
Rififi, а что же это тогда?
Rififi
2338 / 1053 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
27.08.2009, 00:19     Динамическое выделение #14
Monte-Cristo,
Rififi, а что же это тогда?
самостоятельня сущность языков C/C++, имеющая две определяющих характеристики: тип и размер.
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
27.08.2009, 00:24     Динамическое выделение #15
Цитата Сообщение от Rififi Посмотреть сообщение
самостоятельня сущность языков C/C++, имеющая две определяющих характеристики: тип и размер.
ну я стобой согласен.. отчасти.. но ты думаешь Golovastik понял? Я то отвечал чтоб он понял, а не чтоб ты оценивал корректность ответа с точки зрения архитектуры.
Rififi
2338 / 1053 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
27.08.2009, 00:40     Динамическое выделение #16
... но ты думаешь Golovastik понял? ...
... Я то отвечал чтоб он понял ...
А ты, как я погляжу, не особо высокого мнения об интеллектуальных способностях Golovastik'а...
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
27.08.2009, 00:43     Динамическое выделение #17
Цитата Сообщение от Rififi Посмотреть сообщение
Monte-Cristo,
Rififi, а что же это тогда?
самостоятельня сущность языков C/C++, имеющая две определяющих характеристики: тип и размер.
все это - спор о терминологии, а не о сущности. разницу между "указателем на первый элемент" и "именем массива" знает только компилятор, и то "вроде как". вот здесь заругается на третий "массив", т.к. память выделить нужно, а неизвестно сколько. а под первый выделил без проблем. но когда эти "сучности" уже существуют, разница будет только там, где необходим контроль типов.

C++
1
2
3
4
5
    long max = 10;
    long *arrayname = new long[max];
    long arrayname2 [10];
    long arrayname3 [];
        delete arrayname;
в остальных случаях все это будет компилироваться в одинаковый код:

C++
1
2
    long n = *arrayname;
    n = *arrayname2;
кстати, и длину проверять не будет. оба присвоения скомпилируются без проблем:

C++
1
2
n = arrayname[1000];
n = arrayname2[1000];
и такое тоже скомпилируется и правильно выполнится:

C++
1
2
3
4
5
long *arrayname4 = arrayname;
n = arrayname4[1000];
 
long *arrayname5 = arrayname2;
n = *(arrayname2+1000);
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
27.08.2009, 00:47     Динамическое выделение #18
Цитата Сообщение от Rififi Посмотреть сообщение
А ты, как я погляжу, не особо высокого мнения об интеллектуальных способностях Golovastik'а...
да я вообщем-то и о своих не высокого мнения (все таки только с января занимаюсь С/С++. или вернее он мной... короче пофик ) я еще учусь.
Rififi
2338 / 1053 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
27.08.2009, 00:50     Динамическое выделение #19
novi4ok ,
возможно потому что начинал с ассемблера, но все это мне кажется спором о терминологии, а не о сущности.

в таких случаях немерянно рулит приём под названием "удар ниже пояса"
если в массиве int arr[10] имя arr - это указатель на первый элемент (и соответственно имеющий тип int*) то скажи, в таком массиве:
int arr[10][10] - сколько будет указателей, будут ли они вообще, и если будут, то куда они будут указывать и какой иметь тип?

Всё. Этот вопрос обычно приводит апологетов теории "имя массива == указатель" в состояние прострации :lol:
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2009, 00:56     Динамическое выделение
Еще ссылки по теме:

Динамическое выделение памяти - C++
Дан такой код:#include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; int main() { int a; // матрица 9 на 9 целочисленная...

Динамическое выделение памяти - C++
Почему распечатка матрицы Matr1 в f2 дает матрицу из ед., а в f1 матрицу из нулей? Ведь адрес первого эл. массива Matr2 сохранен в...

Динамическое выделение памяти - C++
Объясните пожалуйста.Не могу понять в чём разница между malloc,calloc/free и new/delete

Динамическое выделение памяти - C++
Доброго времени суток всем!:) Есть такая проблема... Дан класс полином. который содержит закрытые члены коэффициент и степень полинома, а...

Динамическое выделение памяти - C++
Здраствуйте. Собственно сам код и вопрос: почему могу свободно выходить за границы массива? Для чего тогда размерность указывается......


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

Или воспользуйтесь поиском по форуму:
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
27.08.2009, 00:56     Динамическое выделение #20
Цитата Сообщение от Rififi Посмотреть сообщение
Этот вопрос обычно приводит апологетов теории "имя массива == указатель" в состояние простраци :lol:
Ну это как посмотреть. Все в нашем мире относительно и зависит от точек зрения.

например такой код:

C++
1
2
3
4
5
6
7
int main()
{
    int A[2][2] = {{1, 2}, {3, 4}};
    cout << *(*(A+1));
    cin.get();
    return 0;
}
Явно дает понять о работе статическо массива как указателя путем обычной адрессной арифметики.
Yandex
Объявления
27.08.2009, 00:56     Динамическое выделение
Ответ Создать тему
Опции темы

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