crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
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


фрилансер
******

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


AXELman4ever, оператор [] определён для указателя таким образом, что он сам разыменовывает его, сдвинув на нужный индекс:

выражение
b[i]

эквивалентно выражению
*(b+i)


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

delete[] b;
b=0;
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 30.9.2011, 22:00
Сообщение #3


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(Алексей1153 @ 1.10.2011, 0:19) *
если так к куче обратиться после удаления, то споймаешь падёж программы

на самом деле, падёж будет не всегда. это будет зависеть от распределения памяти при компиляции. но это даже ещё хуже: потом такую ошибку хрен найдёшь. так что после удаления динамического объекта использовать указатель нельзя.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AXELman4ever
  опции профиля:
сообщение 1.10.2011, 0:27
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 31
Регистрация: 22.9.2011
Пользователь №: 2902

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Алексей1153 @ 30.9.2011, 21:19) *
что ты делал в данном случае - я не знаю.


В данном случае я навел пример, на котором и хотел разобраться :) Ковыряясь в Гугле все подобные моему примеру заканчиваются удалением массива, без обнуления указателя. Нигде слова об этом нет.

И вот проверив данный метод, сразу задался вопросом - в чем его смысл, если он, на первый взгляд, не сыграл своей роли.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Mingun
  опции профиля:
сообщение 1.10.2011, 19:55
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 28.9.2009
Пользователь №: 1122

Спасибо сказали: 0 раз(а)




Репутация:   0  


Указатель обнулять и вправду не обязательно. Всё будет работать и так. Однако обнуление указателя считается хорошим тоном, поскольку в таком случае вы схлопочете access violation при обращении по нулевому адресу. Что, согласитесь, значительно упрощает поиск проблемы, нежели внезапная неправильная работа программы в исключительных случаях (которых годами может не быть, но которые появляются в самый неподходящий момент :huh:).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 1.10.2011, 21:41
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(AXELman4ever @ 30.9.2011, 21:52) *
я по прежнему могу обратиться к указателю и проверить доступность значений по индексу. А каков же смысл тогда delete[] ?
а что ты ожидал?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AXELman4ever
  опции профиля:
сообщение 2.10.2011, 14:43
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 31
Регистрация: 22.9.2011
Пользователь №: 2902

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 1.10.2011, 21:41) *
Цитата(AXELman4ever @ 30.9.2011, 21:52) *
я по прежнему могу обратиться к указателю и проверить доступность значений по индексу. А каков же смысл тогда delete[] ?
а что ты ожидал?


Ожидал что этому найдется объяснение. Оно нашлось, благодарю. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
enslaver
  опции профиля:
сообщение 3.10.2011, 7:58
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 30
Регистрация: 25.3.2010
Пользователь №: 1565

Спасибо сказали: 0 раз(а)




Репутация:   0  


могу сказать то что
char b[10];

и
char *a=new c[10];

в сущности являются одним и тем же. так как в первом случае переменная b является ссылкой на массив(на его первый член), так же как и во втором случае объявления.
то есть b уже является (char *);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 3.10.2011, 8:52
Сообщение #9


фрилансер
******

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


enslaver, в обоих случаях это указатель на начало массива. Разница этих способов в том, что в первом массив расположен на стеке, а во втором - в куче
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 10.6.2025, 0:12