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

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

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

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

26.08.2009, 21:56. Просмотров 2696. Ответов 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++
Всем привет. Научите, пожалуйста, правильно пользоваться динамическим выделением памяти. Допустим, у меня есть функция, где я пытался...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Rififi
2338 / 1053 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
27.08.2009, 01:00     Динамическое выделение #21
обычной адрессной арифметики.
по этому поводу есть другой, не менее чУдный вопрос:
имеем:
int arr[10][10];

валидна ли следующая строчка и что она означает:
C++
1
&arr;
для асиливших - переход на следующий уровень
тот же вопрос для:
C++
1
&arr + 1;
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
27.08.2009, 01:07     Динамическое выделение #22
Цитата Сообщение от Rififi Посмотреть сообщение
[B]если в массиве int arr[10] имя arr - это указатель на первый элемент (и соответственно имеющий тип int*) то скажи, в таком массиве:
int arr[10][10] - сколько будет указателей, будут ли они вообще, и если будут, то куда они будут указывать и какой иметь тип?
это будет указатель на указатель на тип int (int**), будет указывать на первый элемент массива указателей на int
Rififi
2338 / 1053 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
27.08.2009, 01:15     Динамическое выделение #23
это будет указатель на указатель на тип int (int**), будет указывать на первый элемент массива указателей на int
Замечательно.
таким образом мы приходим к тому, что вот этот код отработает нормально, так?
C++
1
2
3
4
5
6
7
8
9
void f(int** arr)
{
    for (int i=0; i<10; i++)
    for (int j=0; j<10; j++)
        arr[i][j] = 0;
}
 
int arr[10][10];
f(arr);
Добавлено через 2 минуты
PS. и ещё вот вопрос: а элементы a[0] .. a[9] - это тоже указатели, или что?
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
27.08.2009, 01:23     Динамическое выделение #24
Цитата Сообщение от Rififi Посмотреть сообщение
таким образом мы приходим к тому, что вот этот код отработает нормально, так?
Нет. Потом что типы не равны. int A[][] ближе(но не равен) к указателю int* так как элементы в статическом массиве распологаются друг за дружкой.

Добавлено через 3 минуты
То есть вот этот код будет вполне корректен:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void func(int* Z)
{
    for (int i=0; i<4; i++)
        cout << Z[i] << " ";
}
 
int main()
{
    int A[2][2] = {{1, 2}, {3, 4}};
    func((int*)A);
    cin.get();
    return 0;
}
Mozart
39 / 17 / 1
Регистрация: 21.08.2009
Сообщений: 63
27.08.2009, 01:33     Динамическое выделение #25
А вот назрел такой вопрос, как для
C++
1
int **A;
корректно выделить память?
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
27.08.2009, 01:37     Динамическое выделение #26
Например так (матрица mxn):

C++
1
2
3
int **A = new int*[m];
for (int i=0; i<m; i++)
    A[i] = new int[n];
Добавлено через 1 минуту
Rififi, факт остается фактом. Мы сейчас не говорим о размещении массивов в памяти. Мы говорим о том, что имя массива указывает на его первый элемент.
Rififi
2338 / 1053 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
27.08.2009, 01:43     Динамическое выделение #27
C++
1
Нет. Потом что типы не равны.
как не равны. а вот novi4ok утверждает что равны. я вот даже процитирую:
это будет указатель на указатель на тип int (int**)
так какой же будет тип у A?

int A[][] ближе(но не равен)
"ближе", "дальше"... ***се. Мы всё еще про C++, строгий и стандартизированный язык, обладающей Тьюринг-полнотой? R.O.F.L.

Добавлено через 5 минут
Мы сейчас не говорим о размещении массивов в памяти. Мы говорим о том, что имя массива указывает на его первый элемент.
Да погодь ты...
ты генерируешь пёрлы с такой скоростью, я проржаться не успеваю ((((((((:

про "неразговор о размещении массива в памяти" (а интересно где тогда, в вакууме?? (блин... такая кора... ващще Ж)))))))))) ) ) мы еще вершемся к этому я надеюсь.

Мы говорим о том, что имя массива указывает на его первый элемент
ну так я это и пытаюсь выяснить. куда именно оно указывает, и какой тип имеет.
Mozart
39 / 17 / 1
Регистрация: 21.08.2009
Сообщений: 63
27.08.2009, 01:47     Динамическое выделение #28
ну что-то похожее у меня и получилось, только там кавычек лишних было.
Самое любопытное что в итоге:
C++
1
2
3
4
int a[10][10];
int** A;
a[1][3];//Обращение к ним работает одинаково Х_х
A[2][3];
Rififi
2338 / 1053 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
27.08.2009, 01:55     Динамическое выделение #29
Обращение к ним работает одинаково Х_х

кстати да.

вот мы например имеем функцию и класс.
C++
1
2
3
4
5
6
7
8
9
10
11
void f(int i);
 
struct S
{
    void operator()(int i);
};
 
S s;
 
f(10);
s(20);
таким образом получается, что классы и функции - это одно и тоже.

или вот ещё:
C++
1
2
3
4
5
6
struct P
{
   int i;
};
 
P p;
указатель на структуру (&p) равен указателю на её первый элемент (&p.i); значит это что? пральна, одно и тоже. Там где требуется P можно передавать int, и наоборот.
а-ха-ха. да я сегодня в ударе ((((((((((((((:
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
27.08.2009, 10:39     Динамическое выделение #30
Rififi, спасибо за массив массивов.
В общем, наверное так
a = new []
a не является ссылкой на первый элемент массива, но совпадает с ней
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
27.08.2009, 10:55     Динамическое выделение #31
Цитата Сообщение от Rififi Посмотреть сообщение
C++
1
Нет. Потом что типы не равны.
как не равны. а вот novi4ok утверждает что равны. я вот даже процитирую:
это будет указатель на указатель на тип int (int**)
так какой же будет тип у A?
.
nu pojmali, pojmali.
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
27.08.2009, 11:59     Динамическое выделение #32
Цитата Сообщение от Rififi Посмотреть сообщение
ты генерируешь пёрлы с такой скоростью, я проржаться не успеваю ((((((((:
Ну уж помедленней твоего бреда, который не упорядочен и призван чтоб запутать начинающих.

Цитата Сообщение от Rififi Посмотреть сообщение
ну так я это и пытаюсь выяснить. куда именно оно указывает
C++
1
2
3
4
5
6
    int A1[2] = {1 , 2};
    int A2[2][2] = {{1, 2}, {3, 4}};
    int A3[2][2][2] = {{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}};
    cout << "A1 = " << *A1 << endl;
    cout << "A2 = " << **A2 << endl;
    cout << "A3 = " << ***A3 << endl;
На первый элемент. Или ты веришь в чудеса? Тебе сейчас никто не доказывает что имя массива == указателю на тип. Тебе лишь говорят, что имя массива указывает(а не указатель) на его первый элемент.


Цитата Сообщение от Rififi Посмотреть сообщение
указатель на структуру (&p) равен указателю на её первый элемент (&p.i);
не указатель на структуру, а адресс структуры будет совпадать с адресов первого его поля. но тема не об этом.
Mozart
39 / 17 / 1
Регистрация: 21.08.2009
Сообщений: 63
27.08.2009, 12:37     Динамическое выделение #33
Так можно спорить до потери пульса. Любая переменная указывает адрес памяти где лежит само значение переменной.
Например:
C++
1
2
3
int a;//а указывает на какойто адрес по которому находится первый байт переменной int
int *A;//А указывает на какойто адрес по которому находится первый байт адреса
// по которому находится первый байт переменной типа int
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
27.08.2009, 12:45     Динамическое выделение #34
Цитата Сообщение от Mozart Посмотреть сообщение
Так можно спорить до потери пульса. Любая переменная указывает адрес памяти где лежит само значение переменной.
нет. указывать может указатель (адрес). а переменная лежит себе в памяти и занимает себе место. она сама и есть память.
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
27.08.2009, 12:47     Динамическое выделение #35
Цитата Сообщение от Mozart Посмотреть сообщение
int a;//а указывает на какойто адрес по которому находится первый байт переменной int
нет.. &a - это адресс перменной a. А a это непосредственно сама переменная. Чтобы с ней работать, ее не надо разименовывать.
Mozart
39 / 17 / 1
Регистрация: 21.08.2009
Сообщений: 63
27.08.2009, 12:53     Динамическое выделение #36
Ладно давайте так:
C++
1
2
3
4
5
{
int a;
}
int b;
int a;
Я так понимаю сначала выделяется память под переменную а, потом эта память освобождается, потом выделяется для b, и после выденяется новый кусок снова под а. или я не прав?
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
27.08.2009, 12:57     Динамическое выделение #37
Mozart, у тебя создается перменная в блоке. Она локальная. После выхода из блока - она уничтожается. Потом создается перменная b, а затем и a. Говорить о выделении немного некорректно. Так как создание любой переменной связано с выделением под нее памяти (даже под переменную-указатель). Обычно о выделении памяти под переменную говорят при использовании new/malloc (так как это выделение задается програмно, а не выполняется компилятором).
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
27.08.2009, 12:57     Динамическое выделение #38
Цитата Сообщение от Mozart Посмотреть сообщение
Любая переменная указывает адрес памяти где лежит само значение переменной.
Не "указывает", а является адресом переменной.
int a=5;
Число 5 записано по адресу a. Т.е. через букву a, или с помощью буквы a, происходит указание/именование/адресация некоторой области, в которую мы записали что-то.

В общем - есть то-о-онкий нюанс

Есть сущность (материальность), а есть имя, которым мы обозначаем эту сущность.
Указатель, это тоже сущность, но его материальность означает адрес/имя другой сущности.
Mozart
39 / 17 / 1
Регистрация: 21.08.2009
Сообщений: 63
27.08.2009, 13:04     Динамическое выделение #39
Monte-Cristo, Если мы этого не видим или не делаем, не значит что это не происходит =)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2009, 13:06     Динамическое выделение
Еще ссылки по теме:

Динамическое выделение памяти - 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, 13:06     Динамическое выделение #40
Цитата Сообщение от Mozart Посмотреть сообщение
Monte-Cristo, Если мы этого не видим или не делаем, не значит что это не происходит =)
а я тебе и не сказал что это не происходит.
Yandex
Объявления
27.08.2009, 13:06     Динамическое выделение
Ответ Создать тему
Опции темы

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