Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.58/19: Рейтинг темы: голосов - 19, средняя оценка - 4.58
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
1

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

26.08.2009, 21:56. Показов 3614. Ответов 44

Author24 — интернет-сервис помощи студентам
Если кто может,дайте расшифровку этому:
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.08.2009, 21:56
Ответы с готовыми решениями:

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

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

Динамическое выделение памяти
Всем здравствуйте) помогите пожалуйста))) Контрольные вопросы 1. Раскройте понятие указателя в...

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

44
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
26.08.2009, 22:01 2
прочтите в той же книге что такое указатели (pointers) и управление памятью. если в ней этого нет - возьмите другую книгу, где этого есть.
0
640KB мне хватило на всё.
119 / 50 / 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
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
26.08.2009, 22:14  [ТС] 4
Пожалуйста,кто может, дайте расшифровку немного дальше.
0
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
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
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
26.08.2009, 22:43  [ТС] 6
Спасибо. Меня ещё интересует вот эта строка:
C++
1
    pprime = new long[max];
Это вроде и не масив, потому что масив имеет имя и и тип и индекс, а тут тип и индекс? Чо-то не врубаю.
Дайте пожалуйста полное расшифрование этой строки.
0
2816 / 1407 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
26.08.2009, 22:47 7
Golovastik, это динамическое выделение памяти под массив. Выделяется память под массив типа long размером max и возвращается указатель на эту область (а именно на первый его элемент).
0
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
26.08.2009, 22:57  [ТС] 8
А название масива определяется тогда вот этой строкой:
Код
long* pprime = 0;
Если масив,тогда он должен иметь имя. Оно определяется указателем на лонг. И получается что имя масива pprime состоящий из элементов [max]
0
2816 / 1407 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
26.08.2009, 23:03 9
Цитата Сообщение от Golovastik Посмотреть сообщение
Если масив,тогда он должен иметь имя. Оно определяется указателем на лонг. И получается что имя масива pprime состоящий из элементов [max]
Фактически да. Вообще, статический массив - это указатель на первый элемент массива.
0
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
26.08.2009, 23:33  [ТС] 10
Имя масива(динамического) - это указатель на первый элемент масива?
0
2816 / 1407 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
26.08.2009, 23:35 11
Да.
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
26.08.2009, 23:39 12
Цитата Сообщение от Golovastik Посмотреть сообщение
Имя масива(динамического) - это указатель на первый элемент масива?
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
Да.
А теперь - правильный ответ (:
Имя массива - это НЕ указатель на его первый элемент.
Книги, в которых утверждается иное, можно использовать для полее полезных действий
0
2816 / 1407 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
27.08.2009, 00:09 13
Rififi, а что же это тогда?
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
27.08.2009, 00:19 14
Monte-Cristo,
Rififi, а что же это тогда?
самостоятельня сущность языков C/C++, имеющая две определяющих характеристики: тип и размер.
0
2816 / 1407 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
27.08.2009, 00:24 15
Цитата Сообщение от Rififi Посмотреть сообщение
самостоятельня сущность языков C/C++, имеющая две определяющих характеристики: тип и размер.
ну я стобой согласен.. отчасти.. но ты думаешь Golovastik понял? Я то отвечал чтоб он понял, а не чтоб ты оценивал корректность ответа с точки зрения архитектуры.
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
27.08.2009, 00:40 16
... но ты думаешь Golovastik понял? ...
... Я то отвечал чтоб он понял ...
А ты, как я погляжу, не особо высокого мнения об интеллектуальных способностях Golovastik'а...
0
556 / 510 / 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
2816 / 1407 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
27.08.2009, 00:47 18
Цитата Сообщение от Rififi Посмотреть сообщение
А ты, как я погляжу, не особо высокого мнения об интеллектуальных способностях Golovastik'а...
да я вообщем-то и о своих не высокого мнения (все таки только с января занимаюсь С/С++. или вернее он мной... короче пофик ) я еще учусь.
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
27.08.2009, 00:50 19
novi4ok ,
возможно потому что начинал с ассемблера, но все это мне кажется спором о терминологии, а не о сущности.

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

Всё. Этот вопрос обычно приводит апологетов теории "имя массива == указатель" в состояние прострации :lol:
1
2816 / 1407 / 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.08.2009, 00:56
Помогаю со студенческими работами здесь

Динамическое выделение памяти
Не могу разобраться с динамическим выделением памяти. Объект - учреждение. Имеет параметры -...

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru