Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамическое выделение 
:(
    Опции темы
Golovastik
Дата 26.8.2009, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 19.7.2009

Репутация: -1
Всего: 0



Если кто может,дайте расшифровку этому:

Код

pprime = new long[max];
    *pprime = 2;
    *(pprime + 1) = 3;
    *(pprime + 2) = 5;


этому:
Код

    found = (trial%*(pprime + i)) == 0;


 этому:

Код

    if(found == 0)
        *(pprime + count++) = trial;



и этому:
Код
delete [] pprime;


из этого кода:


Код
#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, не могу въехать,что они делают.Желательно было б объяснить весь код,если кто сможет. [COLOR="Blue"]Благодарю за терпение.[/COLOR]
PM MAIL   Вверх
mes
Дата 26.8.2009, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Golovastik @  26.8.2009,  20:00 Найти цитируемый пост)
    *pprime = 2;
    *(pprime + 1) = 3;
    *(pprime + 2) = 5;
...
    *(pprime + i)

доступ к n-му элементу посредством арифметических операций с указателем на первый элемент массива.
приведенные в цитате записи аналогичны по сути следующим :
Код

prime[0] = 2;
prime[1] = 3;
prime[2] = 5;
...
prime[i]

если опять не понятно, то следует почитать что есть массивы ...  smile 

Это сообщение отредактировал(а) mes - 26.8.2009, 21:30


--------------------
PM MAIL WWW   Вверх
Golovastik
Дата 26.8.2009, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 19.7.2009

Репутация: -1
Всего: 0



С этим ясно,не ясно вот эта строка.
Код

    pprime = new long[max];



Это вроде и не масив, потому что масив имеет имя и и тип и индекс, а тут тип и индекс? Чо-то не врубаю.
PM MAIL   Вверх
Galaran
Дата 26.8.2009, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 25.5.2009

Репутация: нет
Всего: 2



Код

pprime = new long[max];


оператор new создаст в динамической (т.е. во время выполнения программы) памяти массив чисел long размером max и вернет указатель на 1й элемент (присвоит его pprime) и дальше идёт обращение к этому массиву косвенно, через разыменование и смещение указателя
PM MAIL   Вверх
Gordon
Дата 26.8.2009, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: 1
Всего: 6



Цитата(Golovastik @  26.8.2009,  22:41 Найти цитируемый пост)
Это вроде и не масив, потому что масив имеет имя и и тип и индекс, а тут тип и индекс? 


Наверное не индекс, а размер!  smile 


--------------------

  
     
PM MAIL WWW   Вверх
Golovastik
Дата 26.8.2009, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 19.7.2009

Репутация: -1
Всего: 0



А название масива определяется тогда вот этой строкой:
Код

long* pprime = 0;

Если масив,тогда он должен иметь имя. Оно определяется указателем на лонг. И получается что имя масива pprime состоящий из элементов [max]
PM MAIL   Вверх
Gordon
Дата 26.8.2009, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: 1
Всего: 6



Чтобы работать с массивом, нужно знать адрес первого элемента и количество элементов.
pprime - имя указателя, после выделения памяти указывает на первый элемент массива (если операция new выполнилась удачно)
max- количество элементов.


--------------------

  
     
PM MAIL WWW   Вверх
Golovastik
Дата 26.8.2009, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 19.7.2009

Репутация: -1
Всего: 0



 Имя масива(динамического) - это указатель на первый элемент масива? 

Это сообщение отредактировал(а) Golovastik - 26.8.2009, 22:36
PM MAIL   Вверх
Gordon
Дата 26.8.2009, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: 1
Всего: 6



Цитата(Golovastik @  26.8.2009,  23:33 Найти цитируемый пост)
Имя масива(динамического) - это указатель на первый элемент масива? 


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

Код

int *arr = new int[10];
delete[] arr;
    
int n = 10;
arr = &n;


но, мне кажеться, так делать - не очень красиво...  smile



Это сообщение отредактировал(а) Gordon - 26.8.2009, 23:03


--------------------

  
     
PM MAIL WWW   Вверх
mes
Дата 26.8.2009, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Golovastik @  26.8.2009,  21:33 Найти цитируемый пост)
Имя масива(динамического) - это указатель на первый элемент масива? 

Нет.. массив безымянный и создается в Вашем примере правой частью строки: 
Код

new long[max];

после выполнения приведенной части сторки  будет создан массив в динамической памяти, но пользоваться мы им пока не сможем.
Чтоб получить доступ к массиву, мы присваем указателю адрес первого элемента массива (то что нам вернет new)

Например:
Код

long * p1, *p2, *p3; // три указателя
p1 = p2 = p3 =      // присваиваим им 
                          new long[10]       //  адрес  новосозданного массива, он же адрес первого элемента массива

p1[2] = p2[4]; //  значение 4го элемента массива присваиваем второму.

p2 = new long[20]; // присваивем одному из указателей адрес еще одного новосозданного массива


p1[3] = p2[5]; //  значение 5го элемента второго массива присваиваем 3му элементу первого массива.

delete p3;  // удаляем первый массив

p1[0]++; // инкрементируем первый элемент, 
             // ошибка рантайма, потому что массив на который указывает указатель только что был удален.

p2=NULL;  // обнуляем указатель,
                 //  теперь мы не можем удалить 2й массив, так как больше у нас нет доступа к нему  (ни один указатель на него не указывает)




Добавлено через 6 минут и 13 секунд
И все же лучше
Цитата(mes @  26.8.2009,  20:30 Найти цитируемый пост)
 почитать что есть массивы .

В книжке все это подробно разобрано, а на форуме Вы получите лишь обрывки..


Это сообщение отредактировал(а) mes - 26.8.2009, 22:57


--------------------
PM MAIL WWW   Вверх
bsa
Дата 26.8.2009, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Golovastik, ты из книг вбил себе в голову, что массив должен иметь имя. Это не так. В программировании массивом называется набор переменных одного типа расположенных последовательно в оперативной памяти. Таким образом зная адрес одного из элементов массива, положение его в массиве, можно получить доступ к любому другому элементу этого массива.
Чтобы не путать массивы типа int arr[10] и int *p = new int[10] вторые называются "динамические массивы", так как их размер определяется во время работы программы.
Кстати, я специально сделал тему: Часто задаваемые вопросы. Возможно, там есть то, что тебе нужно.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0816 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.