Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Динамическое выделение


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

Код

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]

Автор: mes 26.8.2009, 21:30
Цитата(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 

Автор: Golovastik 26.8.2009, 21:41
С этим ясно,не ясно вот эта строка.
Код

    pprime = new long[max];



Это вроде и не масив, потому что масив имеет имя и и тип и индекс, а тут тип и индекс? Чо-то не врубаю.

Автор: Galaran 26.8.2009, 21:54
Код

pprime = new long[max];


оператор new создаст в динамической (т.е. во время выполнения программы) памяти массив чисел long размером max и вернет указатель на 1й элемент (присвоит его pprime) и дальше идёт обращение к этому массиву косвенно, через разыменование и смещение указателя

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


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

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

long* pprime = 0;

Если масив,тогда он должен иметь имя. Оно определяется указателем на лонг. И получается что имя масива pprime состоящий из элементов [max]

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

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

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


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

Код

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


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


Автор: mes 26.8.2009, 22:54
Цитата(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 Найти цитируемый пост)
 почитать что есть массивы .

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

Автор: bsa 26.8.2009, 23:11
Golovastik, ты из книг вбил себе в голову, что массив должен иметь имя. Это не так. В программировании массивом называется набор переменных одного типа расположенных последовательно в оперативной памяти. Таким образом зная адрес одного из элементов массива, положение его в массиве, можно получить доступ к любому другому элементу этого массива.
Чтобы не путать массивы типа int arr[10] и int *p = new int[10] вторые называются "динамические массивы", так как их размер определяется во время работы программы.
Кстати, я специально сделал тему: http://forum.vingrad.ru/forum/topic-269794/kw-faq-c++.html. Возможно, там есть то, что тебе нужно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)