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