![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
AXELman4ever |
![]()
Сообщение
#1
|
Студент ![]() Группа: Участник Сообщений: 31 Регистрация: 22.9.2011 Пользователь №: 2902 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Имеется такая запись:
char *b = new char[10]; b[0] = '0'; b[1] = '1'; b[2] = '2'; ... Объясните пожалуйста, почему для записи значения в чар (как я понимаю, по указателю), не требуется его разыменовывать? Я так понимаю что для массивов любого типа всегда форма записи такая, но почему разыменование не требуется? да, кстати... и при удалении массива чаров delete[] b; я по прежнему могу обратиться к указателю и проверить доступность значений по индексу. А каков же смысл тогда delete[] ? |
|
|
Алексей1153 |
![]()
Сообщение
#2
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
AXELman4ever, оператор [] определён для указателя таким образом, что он сам разыменовывает его, сдвинув на нужный индекс:
выражение
эквивалентно выражению
>>да, кстати... и при удалении массива чаров по идее, если так к куче обратиться после удаления, то споймаешь падёж программы (что ты делал в данном случае - я не знаю). Именно поэтому нужно не забывать обнулять указатель после удаления памяти в кучу:
|
|
|
Iron Bug |
![]()
Сообщение
#3
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
если так к куче обратиться после удаления, то споймаешь падёж программы на самом деле, падёж будет не всегда. это будет зависеть от распределения памяти при компиляции. но это даже ещё хуже: потом такую ошибку хрен найдёшь. так что после удаления динамического объекта использовать указатель нельзя. |
|
|
AXELman4ever |
![]()
Сообщение
#4
|
Студент ![]() Группа: Участник Сообщений: 31 Регистрация: 22.9.2011 Пользователь №: 2902 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
что ты делал в данном случае - я не знаю. В данном случае я навел пример, на котором и хотел разобраться ![]() И вот проверив данный метод, сразу задался вопросом - в чем его смысл, если он, на первый взгляд, не сыграл своей роли. |
|
|
Mingun |
![]()
Сообщение
#5
|
Новичок Группа: Новичок Сообщений: 3 Регистрация: 28.9.2009 Пользователь №: 1122 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Указатель обнулять и вправду не обязательно. Всё будет работать и так. Однако обнуление указателя считается хорошим тоном, поскольку в таком случае вы схлопочете access violation при обращении по нулевому адресу. Что, согласитесь, значительно упрощает поиск проблемы, нежели внезапная неправильная работа программы в исключительных случаях (которых годами может не быть, но которые появляются в самый неподходящий момент
![]() |
|
|
Litkevich Yuriy |
![]()
Сообщение
#6
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
AXELman4ever |
![]()
Сообщение
#7
|
Студент ![]() Группа: Участник Сообщений: 31 Регистрация: 22.9.2011 Пользователь №: 2902 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
enslaver |
![]()
Сообщение
#8
|
Студент ![]() Группа: Участник Сообщений: 30 Регистрация: 25.3.2010 Пользователь №: 1565 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
могу сказать то что
и
в сущности являются одним и тем же. так как в первом случае переменная b является ссылкой на массив(на его первый член), так же как и во втором случае объявления. то есть b уже является (char *); |
|
|
Алексей1153 |
![]()
Сообщение
#9
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
enslaver, в обоих случаях это указатель на начало массива. Разница этих способов в том, что в первом массив расположен на стеке, а во втором - в куче
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 10.6.2025, 0:12 |