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

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

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

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

26.08.2009, 21:56. Просмотров 2713. Ответов 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++):

динамическое выделение - C++
совсем запуталась в динамическом выделение памяти.. подскажите,верно ли решено?? #include &lt;iostream&gt; #include &lt;stdio.h&gt; ...

Динамическое выделение памяти - C++
Здравствуйте! Помогите пожалуйста, мне задали сделать чтобы в выделенном (выделить не удалось, оставил теги B, там где идёт &quot;объявляем и...

Динамическое выделение памяти - C++
Создайте динамический массив, хранящий в первой строке имя, а во второй - телефон. Организуйте поиск по имени и по номеру телефона и...

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

Динамическое выделение памяти - C++
У меня есть двумерный булевый квадратный массив. После запуска программы, я получаю переменную size, это то, сколько элементов должно быть...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Rififi
2359 / 1054 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
27.08.2009, 00:40 #16
... но ты думаешь Golovastik понял? ...
... Я то отвечал чтоб он понял ...
А ты, как я погляжу, не особо высокого мнения об интеллектуальных способностях Golovastik'а...
novi4ok
551 / 504 / 8
Регистрация: 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);
Monte-Cristo
2788 / 1374 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
27.08.2009, 00:47 #18
Цитата Сообщение от Rififi Посмотреть сообщение
А ты, как я погляжу, не особо высокого мнения об интеллектуальных способностях Golovastik'а...
да я вообщем-то и о своих не высокого мнения (все таки только с января занимаюсь С/С++. или вернее он мной... короче пофик ) я еще учусь.
Rififi
2359 / 1054 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
27.08.2009, 00:50 #19
novi4ok ,
возможно потому что начинал с ассемблера, но все это мне кажется спором о терминологии, а не о сущности.

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

Всё. Этот вопрос обычно приводит апологетов теории "имя массива == указатель" в состояние прострации :lol:
Monte-Cristo
2788 / 1374 / 30
Регистрация: 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;
}
Явно дает понять о работе статическо массива как указателя путем обычной адрессной арифметики.
Rififi
2359 / 1054 / 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
2359 / 1054 / 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
2788 / 1374 / 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
2788 / 1374 / 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
2359 / 1054 / 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
2359 / 1054 / 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 не является ссылкой на первый элемент массива, но совпадает с ней
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2009, 10:39
Привет! Вот еще темы с ответами:

Динамическое выделение памяти - C++
Имеется: #define Index 1000 typedef int BaseType; typedef BaseType TMemList; typedef unsigned ptrel; typedef struct List...

Динамическое выделение памяти - C++
Всем привет, читал про динам. выделение памяти и тут возник вопрос. Так как для новичков пишут книги не очень глубоко, то в книге ответа на...

Динамическое выделение памяти - C++
Вот у меня есть 2 примера: char* str = &quot;Немыслимый текст&quot;; char* s = new char ; Тут указатель s будет указывать на блок в...

Динамическое выделение памяти new - C++
Доброго времени. У меня в программе есть два двумерных динамических массива. Код компилируется, но возникает ошибка времени выполнения:...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.08.2009, 10:39
Ответ Создать тему
Опции темы

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