Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.10.2011, 11:56   #1
WarHamster
Пользователь
 
Регистрация: 09.08.2010
Сообщений: 48
По умолчанию Указатели в Delphi и С++ - суть

При переезде с Делфи на Си что-то запутался, помогите уложить все в голове. Как я сейчас себе это представляю:
Указатель, грубо говоря, нужен для прямого обращения к ячейкам памяти. Через new мы выделяем под указатель память в зависимости от типа данных. Происходит ли автоматическое выделение памяти под указатели?
Далее, что такое nil/NULL ? Значение указателя, под который не выделена память? Имеет ли смысл запись new(A); A=nil; ?
dispose/delete - опустошение выделенной под указатель памяти и уничожение ссылки на нее. После этого имеет ли указатель значение nil/NULL ?
Передача указателя в функцию - в Delphi можно описать procedure DoSomething ( var A:Pointer ); и изменения значения указателя по ходу выполнения будут перманентны. Как описывается аналогичная ситуация в Си?


Извиняюсь, если вопросы уж очень глупые, просто хочется получить фундаментальное представление о механизме)
WarHamster вне форума Ответить с цитированием
Старый 23.10.2011, 12:45   #2
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

WarHamster

Происходит ли автоматическое выделение памяти под указатели?

Да. Указатель, как и любая другая переменная может быть размещен на стеке, в секции глобальных или константных данных.

Далее, что такое nil/NULL ?

этот Пустота (Ж

Значение указателя, под который не выделена память?

Случайные данные из оперативной памяти процесса.

Имеет ли смысл запись new(A); A=nil; ?

Смысл записи не ясен.

dispose/delete - опустошение выделенной под указатель памяти и уничожение ссылки на нее.

В Cи/C++ нет сборщика мусора, и, соответственно, ссылок на неиспользуемые объекты.

После этого имеет ли указатель значение nil/NULL ?

Значение указателя не измениться, только станет недействительным.

Передача указателя в функцию - в Delphi можно описать procedure DoSomething ( var A:Pointer ); и изменения значения указателя по ходу выполнения будут перманентны. Как описывается аналогичная ситуация в Си?

В Си - передача указателя на указатель:

Код:
void allocate(int** p)
{
   // выделение памяти и изменение переданного аргумента
   *p = (int*) malloc(sizeof(int));
}

int* p = NULL;
allocate(&p); // двойной указатель
В C++ доступна передача по ссылке
Rififi вне форума Ответить с цитированием
Старый 23.10.2011, 12:47   #3
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Цитата:
Сообщение от WarHamster Посмотреть сообщение
Указатель, грубо говоря, нужен для прямого обращения к ячейкам памяти.
Указатель - это переменная, которая хранит не значение, а адрес. Чтобы получить значение, на которое ссылается указатель нужно произвести операцию разыменования указателя.
Цитата:
Сообщение от WarHamster Посмотреть сообщение
Через new мы выделяем под указатель память в зависимости от типа данных.
Тип - дело десятое, главное это размер данных. Можно выделить память под long, а записать туда float, т.к. размеры одинаковые 4 байта. Тип данных лишь интерпретация данных.
Цитата:
Сообщение от WarHamster Посмотреть сообщение
Происходит ли автоматическое выделение памяти под указатели?
Под сами указатели - да, под то на что они указывают - нет.
Цитата:
Сообщение от WarHamster Посмотреть сообщение
Далее, что такое nil/NULL ?
0
Цитата:
Сообщение от WarHamster Посмотреть сообщение
Значение указателя, под который не выделена память?
Указатель, который ссылается на нулевой адрес.
Цитата:
Сообщение от WarHamster Посмотреть сообщение
Имеет ли смысл запись new(A); A=nil; ?
Нет.
Цитата:
Сообщение от WarHamster Посмотреть сообщение
dispose/delete - опустошение выделенной под указатель памяти и уничожение ссылки на нее. После этого имеет ли указатель значение nil/NULL ?
Нет.
An1ka вне форума Ответить с цитированием
Старый 23.10.2011, 12:48   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Происходит ли автоматическое выделение памяти под указатели?
Нет. Указатели это четырех байтные переменные, разворачиваемые загрузчиком в секции данных, хотя если расценить фразу автоматическое выделение памяти под указатели как результат работы загрузчика то можно с натяжкой ответить утвердительно.
Цитата:
Далее, что такое nil/NULL ? Значение указателя, под который не выделена память?
Это 0. Указатель , который никуда не указывает. Или вернее не указывает на доступную часть памяти.
Цитата:
Имеет ли смысл запись new(A); A=nil; ?
Имеет, если хочешь уложить машину, загадив память. A=nil отцепит тебе данные от указателя. Данные зависнут в свободной памяти, и менеджер памяти не сможет более их освободить, потому что ты не сможешь ему обьяснить что ты освобождаешь - указатель ты обнулил.
Цитата:
После этого имеет ли указатель значение nil/NULL ?
Это ИМХО зависит от компилятора. Думаю что популярные компили этим не озабачиваются.
Цитата:
Как описывается аналогичная ситуация в Си?
ИМХО - думаю указатель просто передается как int или void
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объясните суть кода(терминал в С) SlayerLiving Общие вопросы C/C++ 1 12.03.2011 17:16
delphi. указатели. grustniy Помощь студентам 1 05.10.2010 22:58
Редактирование строки. Суть внутри. skeletor PHP 2 06.07.2010 15:31
Суть проблемы такова cheache Свободное общение 6 03.05.2010 13:32
Поясните суть кода на delphi. физический маятник бедный_студент Помощь студентам 2 26.04.2010 19:55