Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
1 / 1 / 0
Регистрация: 10.05.2019
Сообщений: 42

Выпендреж с указателями

31.07.2021, 18:39. Показов 2897. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, не могу понять простых, по-видимому, вещей

C++
1
2
    int *x=new int[3];
    int *y=new int[3];
почему x=y можно, а (x+1)=y - error: expression is not assignable

при этом

почему (++x)=y можно, а (x++)=y - error: expression is not assignable

Заранее благодарю за ответ
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.07.2021, 18:39
Ответы с готовыми решениями:

проблема с указателями
struct magazin { int nomer; char nazvanie; char fio; int kol; double dohod; magazin *prev,*next; magazin *pt,*pg; } ...

Траблы с указателями
Пишу рукописную, динамическую очередь в которой храняться структурные переменные. У меня есть структура: struct Enterprisiz { ...

Операции с указателями
Задание.Создать указатель *ptr на целочисленную переменную и присвоить число 100. Скопировать значения указателя *ptr в указатель *ptr2....

35
53 / 31 / 13
Регистрация: 21.05.2017
Сообщений: 109
01.08.2021, 11:50
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от ValeryS Посмотреть сообщение
озвучьте пожалуйста
If, in the declaration ‘‘T D1’’, D1 has one of the forms:
D[ type-qualifier-listopt assignment-expressionopt ]
D[ static type-qualifier-listopt assignment-expression ]
D[ type-qualifier-list static assignment-expression ]
D[ type-qualifier-listopt * ]
and the type specified for ident in the declaration ‘‘T D’’ is ‘‘derived-declarator-type-list
T ’’, then the type specified for ident is ‘‘derived-declarator-type-list array of T ’’.)
(See 6.7.5.3 for the meaning of the optional type qualifiers and the keyword static.)
т.е. int arr[10]; - массив.

А теперь смотрим на malloc:
The malloc function allocates space for an object whose size is specified by size and whose value is indeterminate.
т.е. никаких массивов malloc не создает.

Точно так же в C++ operator new выделяет память, но не создает никаких массивов,
а вот соответствующее new-expression именно что создает массив,
а не просто набор подряд-идущих друг за другом объектов.
When the allocated object is an array (that is, the noptr-new-declarator syntax is used or the new-type-id or type-id denotes an array type), the new-expression yields a pointer to the initial element (if any) of the array.
т.е. с точки зрения C++ создается именно массив, на первый элемент которого и возвращается указатель.

Цитата Сообщение от ValeryS Посмотреть сообщение
а дальше прочитать
У int'ов нет конструкторов, но это мы опустим - в данном вопросе к массивам это не имеет никакого отношения.

Если сделать то же самое вручную - выделить память и сделать всем объектам placement-new, то массива всё равно не получится.
Это и есть та специфицированная магия, о которой я писал.

И еще раз - на практике, в большинстве случаев, всё это простое балабольство, ни на что не влияющее.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
01.08.2021, 12:01
Цитата Сообщение от MasterOfAlteran Посмотреть сообщение
If, in the declaration ‘‘T D1’’, D1 has one of the forms:
D[ type-qualifier-listopt assignment-expressionopt ]
D[ static type-qualifier-listopt assignment-expression ]
D[ type-qualifier-list static assignment-expression ]
D[ type-qualifier-listopt * ]
and the type specified for ident in the declaration ‘‘T D’’ is ‘‘derived-declarator-type-list
T ’’, then the type specified for ident is ‘‘derived-declarator-type-list array of T ’’.)
(See 6.7.5.3 for the meaning of the optional type qualifiers and the keyword static.)
так что же такое массив?
набор данных?
посмотри что может массив в фортране https://webkonspect.com/?room=... belid=3068
и сравни с Си
Цитата Сообщение от MasterOfAlteran Посмотреть сообщение
т.е. никаких массивов malloc не создает.
Точно так же в C++ operator new выделяет память, но не создает никаких массивов,
т.е
C++
1
2
int* arr=(int*)malloc(3*sizeof(int));
arr[1]=5;
работать не будет?
0
53 / 31 / 13
Регистрация: 21.05.2017
Сообщений: 109
01.08.2021, 12:18
Цитата Сообщение от ValeryS Посмотреть сообщение
посмотри что может массив в фортране
Причем здесь "что может" и "фортран"?
Вроде бы, идет обсуждение "чем является", а не "что может".

Цитата Сообщение от ValeryS Посмотреть сообщение
работать не будет?
Причем здесь "работать не будет"? Речь совершенно о другом.
Я выше написал уже, что на практике это будет неразличимо.
А подвох в том, что этот код массива с точки зрения языка не создает.
Это уже Вы используете эту память как массив и считаете это массивом.

И вот здесь и кроется магия new-expression - оно именно массив создает:
C++
1
2
3
4
int * p = (int *)malloc(sizeof(int) * 3);
for (unsigned i = 0; i < 3;  i++) {
    new (p + i) int(0);
}
вроде бы тоже самое - память выделили, даже "конструктор" позвали, а массива как не было, так и нет.
0
 Аватар для YUEN HOIFEF
252 / 185 / 47
Регистрация: 31.01.2021
Сообщений: 934
01.08.2021, 13:05
т.е. никаких массивов malloc не создает.

Точно так же в C++ operator new выделяет память, но не создает никаких массивов
Выделяют память под массив. Это не подряд идушие байты.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
01.08.2021, 14:38
Цитата Сообщение от YUEN HOIFEF Посмотреть сообщение
Выделяют память под массив. Это не подряд идушие байты.
а что это?
объясните мне что является массивом а что участком выделенной памяти
Цитата Сообщение от MasterOfAlteran Посмотреть сообщение
Я выше написал уже, что на практике это будет неразличимо.
"если нет разницы зачем платить больше" (с)
Цитата Сообщение от MasterOfAlteran Посмотреть сообщение
этот код массива с точки зрения языка не создает.
что такое массив с точки зрения языка?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
01.08.2021, 14:49
Цитата Сообщение от ValeryS Посмотреть сообщение
то такое массив с точки зрения языка?
http://eel.is/c++draft/dcl.array
0
 Аватар для YUEN HOIFEF
252 / 185 / 47
Регистрация: 31.01.2021
Сообщений: 934
01.08.2021, 14:50
Массив это очередность однотипных данных. Я запуталя о чем спор.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
01.08.2021, 15:04
Цитата Сообщение от ValeryS Посмотреть сообщение
а что это?
объясните мне что является массивом а что участком выделенной памяти
Как бы есть два понятия. "Массив" (он же - статически выделенный массив) запись типа int a[10]; и динамически выделенный массив (запись типа new int[10];) . Второй существует только в памяти компьютера, и программист с ним непосредственно никак не работает. А использует Указатель с адресом первого элемента этого динамического массива. А вот со вторым можно непосредственно взаимодействовать, с использованием записей типа a[3] для чтения/записи элементов. Хотя если записать a, мы получим константную переменную с адресом первого элемента статического массива. Которую можно присвоить указателю или с которой производить адресную арифметику.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
01.08.2021, 15:05
Цитата Сообщение от YUEN HOIFEF Посмотреть сообщение
Массив это очередность однотипных данных.
Цитата Сообщение от YUEN HOIFEF Посмотреть сообщение
Это не подряд идушие байты.
определитесь уже
я тоже самое и говорил
Цитата Сообщение от ValeryS Посмотреть сообщение
то что мы в Сях называем массивами есть область памяти для гомогенных данных
массив способ организации данных, и все.
ни объединений ни тебе пересечений ни сложений, ну ничего что должен уметь массив
да обыкновенный размер массива не возможно узнать


TRam_, своими словами и попроще

Добавлено через 1 минуту
Цитата Сообщение от TRam_ Посмотреть сообщение
Второй существует только в памяти компьютера,
а первый где существует?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
01.08.2021, 15:13
Цитата Сообщение от ValeryS Посмотреть сообщение
а первый где существует?
Существует то там же, но с ним можно напрямую обращаться, записями типа a[4] или b[1][3][0] . В отличии от динамических.
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
01.08.2021, 15:18
Цитата Сообщение от ValeryS Посмотреть сообщение
а вот так какой массив создает:
C++
1
2
char *a=new char [3*sizeof(int)];
int  *b=(int *) a;
Пока только char[3*sizeof(int)]. Необходимости создавать что-то ещё тут нет.
Цитата Сообщение от ValeryS Посмотреть сообщение
а вот так:
C++
1
 char *a=(char*)new double[3*sizeof(int)];
К чему эти элементарные вопросы?

Цитата Сообщение от MasterOfAlteran Посмотреть сообщение
reinterpret_cast начинает жизнь объекта.
Это с каких пор?

Цитата Сообщение от MasterOfAlteran Посмотреть сообщение
Никого же в C++ раньше не напрягало, что дальнейшее использование данной памяти без предварительного placement-new - это undefined behaviour.
Все писали и писали, а тут вдруг, выяснилось...
Так уже исправили.
Цитата Сообщение от MasterOfAlteran Посмотреть сообщение
А подвох в том, что этот код массива с точки зрения языка не создает.
"Теперь" создаёт. (Ну и как бы "всегда" создавал, т.к. исправили "ретроактивно")
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
01.08.2021, 15:32
Цитата Сообщение от MasterOfAlteran Посмотреть сообщение
По-моему очевидно, что argcargv имеет ввиду.
В C++ массивы - это вот такие штуки - T[N].
new-expression создает массив, именно массив, и возвращает указатель на первый элемент.
см #7
0
 Аватар для YUEN HOIFEF
252 / 185 / 47
Регистрация: 31.01.2021
Сообщений: 934
01.08.2021, 15:42
ValeryS,
Сообщение от YUEN HOIFEF
Массив это очередность однотипных данных.
Сообщение от YUEN HOIFEF
Это не подряд идушие байты.
определитесь уже
я тоже самое и говорил
Имелось ввиду что в памяти это могут быть не подря идущие байты..
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
01.08.2021, 16:03
Цитата Сообщение от YUEN HOIFEF Посмотреть сообщение
Имелось ввиду что в памяти это могут быть не подря идущие байты..
выравнивание имеется в виду?
Цитата Сообщение от TRam_ Посмотреть сообщение
но с ним можно напрямую обращаться, записями типа a[4] или b[1][3][0]
а с динамически выделенными нельзя?
Цитата Сообщение от TRam_ Посмотреть сообщение
В отличии от динамических.
нет динамических массивов если это не вектор
0
 Аватар для YUEN HOIFEF
252 / 185 / 47
Регистрация: 31.01.2021
Сообщений: 934
01.08.2021, 17:27
Короче вот так я создал массив:
C++
1
char array[ 10 ];
и вот так я создал массив:
C++
1
char *array = new char[ 10 ];
В программе работаю с ним, а не с участком в памяти.

Добавлено через 42 минуты
Во вторм случае, если разбираться, программа создаст статическую переменную char *array и новый обьект типа char [ 10 ], который и есть массив char-ов.
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
01.08.2021, 19:02
Цитата Сообщение от TRam_ Посмотреть сообщение
Как бы есть два понятия. "Массив" (он же - статически выделенный массив) запись типа int a[10];

Фраза некорректна
"Массив" (он же - статически выделенный массив)
Вы ставите знак равенстве между понятием "массив", и понятием "статически выделенный массив", что является грубой логической ошибкой.

Термин "массив" обозначает тип. Память же выделяется для объекта, а не для типа.

Прилагательные: статический, динамический, автоматический - это характеристики объектов, а не их типов.
По научному эти характеристики называются "классами памяти"
И к внешнему виду типов отношения не имеют.

C++
1
2
3
4
5
6
7
8
int a[10]; // статический 
 
int main()
{
    int b[10]; // автоматический
 
    new int[10]; // динамический
}

Поэтому, если вы подразумеваете самый обычный массив, то так его и называйте: "массив".
Но не нужно называть массив статическим, если не подразумевается, что он должен располагаться в статической области памяти.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.08.2021, 19:02

Операция с указателями
SomeClass* ptr = sc1; SomeClass* ptr2 = ptr1; как имея только ptr2 изменить указатель ptr (изменить переменную, на которую ссылается ptr)...

Ошибка с указателями
Необходимо отсортировать одномерный массив. Написал функцию, но компилятор выдаёт ошибку в строке 55: error: invalid type argument of unary...

Массив. с указателями с++
1. Задан массив из 10 целых чисел. Посчитать количество смен знаков заданных чисел. Перебор элементов массива должен осуществляться...

Проблемка с указателями
Нужно перегрузить &quot;+&quot; чтобы он делал слияние 2ух массивов(элементы не повторялись) вот код: #include &lt;iostream.h&gt; #include...

Задача с указателями
Помогите написать программу а) которая читает два Integer-числа и создать два указателя,которые указывают на эти два числа.Затем оба числа...


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Эксперимент с картинкой-обложкой на CodinGame
Adler 10.07.2026
Решил на днях провести эксперимент. У меня есть аккаунт на CodinGame, ТОП-3 по РФ среди 2200 участников (в разделе соревнования по программированию ИИ-ботов). Там есть обложка, куда можно влепить. . .
После бана на Пикабу не работает авторизация аккаунта с Яндекса.
Hrethgir 09.07.2026
В частности https:/ / auto. ru/ logbook/ zapret-na-vozhdenie-posle-65-let_1cf28789-07b4-4c75-a2f7-4cd4edf9deeb тут хотел оставить комментарий такой Зрите в корень - монополизация на разработку программ. . .
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru