Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.81/16: Рейтинг темы: голосов - 16, средняя оценка - 4.81
Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
#1

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

26.08.2009, 21:56. Просмотров 2819. Ответов 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, не могу въехать,что они делают. Желательно было бы объяснить весь код.
Благодарю за терпение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.08.2009, 21:56
Ответы с готовыми решениями:

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

Динамическое выделение памяти
Пусть есть класс с полем char *p. Если для поля p выделяется память...

Динамическое выделение памяти
Всем здрасти.Если выделять динамически память,например: char *p=new char; и...

Динамическое выделение памяти
Подскажите как выделить динамически память мод двумерный массив... Спасибо....

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

44
novi4ok
551 / 504 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
26.08.2009, 22:01 #2
прочтите в той же книге что такое указатели (pointers) и управление памятью. если в ней этого нет - возьмите другую книгу, где этого есть.
0
skvor
640KB мне хватило на всё.
118 / 49 / 3
Регистрация: 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-ый элемент массива

дальше терпелка кончилася
1
Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
26.08.2009, 22:14  [ТС] #4
Пожалуйста,кто может, дайте расшифровку немного дальше.
0
M128K145
Эксперт JavaЭксперт С++
8324 / 3544 / 420
Регистрация: 03.07.2009
Сообщений: 10,708
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; // освобождение динамически выделеной памяти
1
Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
26.08.2009, 22:43  [ТС] #6
Спасибо. Меня ещё интересует вот эта строка:
C++
1
    pprime = new long[max];
Это вроде и не масив, потому что масив имеет имя и и тип и индекс, а тут тип и индекс? Чо-то не врубаю.
Дайте пожалуйста полное расшифрование этой строки.
0
Monte-Cristo
2796 / 1382 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
26.08.2009, 22:47 #7
Golovastik, это динамическое выделение памяти под массив. Выделяется память под массив типа long размером max и возвращается указатель на эту область (а именно на первый его элемент).
0
Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
26.08.2009, 22:57  [ТС] #8
А название масива определяется тогда вот этой строкой:
Код
long* pprime = 0;
Если масив,тогда он должен иметь имя. Оно определяется указателем на лонг. И получается что имя масива pprime состоящий из элементов [max]
0
Monte-Cristo
2796 / 1382 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
26.08.2009, 23:03 #9
Цитата Сообщение от Golovastik Посмотреть сообщение
Если масив,тогда он должен иметь имя. Оно определяется указателем на лонг. И получается что имя масива pprime состоящий из элементов [max]
Фактически да. Вообще, статический массив - это указатель на первый элемент массива.
0
Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
26.08.2009, 23:33  [ТС] #10
Имя масива(динамического) - это указатель на первый элемент масива?
0
Monte-Cristo
2796 / 1382 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
26.08.2009, 23:35 #11
Да.
0
Rififi
2363 / 1056 / 104
Регистрация: 03.05.2009
Сообщений: 2,656
26.08.2009, 23:39 #12
Цитата Сообщение от Golovastik Посмотреть сообщение
Имя масива(динамического) - это указатель на первый элемент масива?
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
Да.
А теперь - правильный ответ (:
Имя массива - это НЕ указатель на его первый элемент.
Книги, в которых утверждается иное, можно использовать для полее полезных действий
0
Monte-Cristo
2796 / 1382 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
27.08.2009, 00:09 #13
Rififi, а что же это тогда?
0
Rififi
2363 / 1056 / 104
Регистрация: 03.05.2009
Сообщений: 2,656
27.08.2009, 00:19 #14
Monte-Cristo,
Rififi, а что же это тогда?
самостоятельня сущность языков C/C++, имеющая две определяющих характеристики: тип и размер.
0
Monte-Cristo
2796 / 1382 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
27.08.2009, 00:24 #15
Цитата Сообщение от Rififi Посмотреть сообщение
самостоятельня сущность языков C/C++, имеющая две определяющих характеристики: тип и размер.
ну я стобой согласен.. отчасти.. но ты думаешь Golovastik понял? Я то отвечал чтоб он понял, а не чтоб ты оценивал корректность ответа с точки зрения архитектуры.
0
Rififi
2363 / 1056 / 104
Регистрация: 03.05.2009
Сообщений: 2,656
27.08.2009, 00:40 #16
... но ты думаешь Golovastik понял? ...
... Я то отвечал чтоб он понял ...
А ты, как я погляжу, не особо высокого мнения об интеллектуальных способностях Golovastik'а...
0
novi4ok
551 / 504 / 25
Регистрация: 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);
0
Monte-Cristo
2796 / 1382 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
27.08.2009, 00:47 #18
Цитата Сообщение от Rififi Посмотреть сообщение
А ты, как я погляжу, не особо высокого мнения об интеллектуальных способностях Golovastik'а...
да я вообщем-то и о своих не высокого мнения (все таки только с января занимаюсь С/С++. или вернее он мной... короче пофик ) я еще учусь.
0
Rififi
2363 / 1056 / 104
Регистрация: 03.05.2009
Сообщений: 2,656
27.08.2009, 00:50 #19
novi4ok ,
возможно потому что начинал с ассемблера, но все это мне кажется спором о терминологии, а не о сущности.

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

Всё. Этот вопрос обычно приводит апологетов теории "имя массива == указатель" в состояние прострации :lol:
1
Monte-Cristo
2796 / 1382 / 107
Регистрация: 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;
}
Явно дает понять о работе статическо массива как указателя путем обычной адрессной арифметики.
0
27.08.2009, 00:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2009, 00:56

Динамическое выделение памяти
Здравствуйте! Помогите пожалуйста, мне задали сделать чтобы в выделенном...

Динамическое выделение памяти
Доброго времени суток. Пытаюсь разобраться с динамическим выделением память. ...

динамическое выделение имен
Есть такая проблема.. В базе имеются записи типа: Ф.И.О., пол, возраст, адрес,...


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

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

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