![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Fritz |
|
|||
|
Unregistered |
Люди помогите разобраться с указателями, зачем они ВООБЩЕ нужны а?
|
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 2 Всего: 261 |
Указатель сразу дает адрес ячейки в памяти, где находтся информация, а при использовании переменных сначала ищется в памяти имя переменной, а потом тот самый адрес.
Указатели используются в основном для работы с динамически изменяемыми массивами или в программах, где нужно постоянно чистить память из-за большого количества перебираемых данных. Плюс - это выходя для передачи или возврата неограниченного числа параметров в функцию, массива, короче... |
|||
|
||||
| bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 3 Всего: 317 |
кроме вышесказанного:
один из самых важных преимуществ указателей это, что они позволяют передавать данные по адресу а не по значению: напр. если у нас есть массив с 10^10 ячеек, то можно просто передать его адрес в функцию, и не надо всю информацию перекачивать на каждый вызов этой функции. -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
И ко всему прочему, могу добавить кучу своих комментариев в теме с таким же названием, находящейся в форуме чуть ниже
-------------------- ![]() |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
oops
|
|||
|
||||
| necrom |
|
||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 21.2.2011 Репутация: нет Всего: нет |
Подскажите по указателям вот такую тему.
Почему в первом случае, будет 2
А во втором, 6
И почему данный пример не будет работать при таком раскладе.
Как я понял, здесь идёт приведения типа к указателю (int*), но вот дальше не понятки ( |
||||||||
|
|||||||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
necrom
Да уж, ник у тебя соответствует дате поднятой темы ты сам эту двойку присвоил, а постфиксный оператор ++ возвращает предыдущее значение. потому что так работает арифметика указателей, + 1 на указателе прибавляет указателю число, равное размеру типа указателя, т.е. в данном случае размеру типа int, т.е. 4. Потому что ты пытаешься получить объект int, находящийся по адресу 2, а кто сказал, что этот адрес принадлежит тебе? |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
а не пытаетесь ли Вы нас обмануть ?! Добавлено через 1 минуту и 24 секунды упс.. а на дату я и не посмотрел Добавлено через 3 минуты и 7 секунд
добавлю ссылку: http://forum.vingrad.ru/topic-20101.html |
|||
|
||||
| necrom |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 21.2.2011 Репутация: нет Всего: нет |
А если читать дословно данную строчку int *iptrs= (int*) 2; то это будет так: Указателю iptrs присвоить адрес памяти в котором записано 2? А как ещё данную запись прочитать 0[&iptrs]? Нулевой элемент массива по данному адресу? |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
не совсем. Указателю iptrs присвоить адрес памяти равной 2. т.е сам адрес равен 2. Походу, это явно системная память. к тому же он не выравнен, а значит щаз придет сыроежка, и опять задолбает, что это вообще не адрес 0[&iptrs] это аналог записи &iptrs[0] то есть это абсолютные синонимы. Означает адрес самого первого элемента массива. |
|||
|
||||
| necrom |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 21.2.2011 Репутация: нет Всего: нет |
Фух вроде разобрался, спасибо.
Ещё вот такой, надеюсь последний вопрос.
Опять же, как правильно прочитать. И почему ошибка при записи? Переменной ptr типа указателя, на указатель, на указатель типа int выделяется массив памяти из 50 элементов указателей, на указатель типа int. Записываем адрес в указатель, на указатель. Ошибка при записи потому, что не выделена память для указателя?
|
||||
|
|||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Вы выделили массив int **[50], и не проинициализировали ни один из членов массива.
**ptr = &da; // здесь в левой части вы разименовываете первый элемент, а это указатель, который непроинициализирован. нужно как-то так int ***ptr=new int **[50]; // выделили массив 50 указ.на указ int * my_pointer; // какой-то отдельный указатель ptr[0] = &my_pointer; // инициализруем первый элемент выделенного массива. *ptr[0] = &da; // ну вот теперь можно. **ptr = &da; // это синоним предыдущ. строки. my_pointer = &da; // это то, что фактически происходит в этой строке Короче говоря, прежде чем разименовывать указатель, нужно его проинициализировать. Иначе вы обращаетесь по случайному адресу - мусору. А вообще не заморачивайтесь с глубоко вложенными указателями, больше двух ** очень редко когда нужно. |
|||
|
||||
| necrom |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 21.2.2011 Репутация: нет Всего: нет |
Аргх
my_pointer указывает же тоже на мусор. Мы берём адресс указателя указывающий на мусор и записываем в указатель ptr. А, если рассматривать, то что будет творится в памяти. Предположим у нас есть адреса 0x1000 - 0x1032, то эти указатели будут выглядеть так? И когда мы будем инициализировать первый элемент массива мы запишем 0xFFF (предполагая, что 0xFFF это адрес указателя my_pointer)
Это сообщение отредактировал(а) necrom - 5.8.2011, 18:10 |
||||
|
|||||
| volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
да, в данной точке значение my_pointer есть мусор, но мы его значение не используем. Мы берем адрес my_pointer , а он точно определен, и записываем этот адрес в 0-ой элемент массива. Остальные 49 элементов в данном коде пока не проинициализированы. |
||||
|
|||||
| volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
да. все верно! У нас массив указателей на указатели. То есть в каждый элемент нужно записать адрес какого-то указателя. И пока мы не запишем, разыменовывать элементы нельзя. В 0-ой элемент мы записали адрес указателя, поэтому можно его разыменовать. в ptr[0] хранится адрес my_pointer, следовательно *ptr[0] - это и есть my_pointer,
а остальные 49 элементов не инициализированы, и например в ptr[1], или ptr[2], хранится мусор, так как мы их не инициализировали пока, следовательно *ptr[1] - это есть разыменование не иницилизированного указателя, т.е указателя указывающего неизвестно куда. и будет ошибка. Не понятно что вам не понятно. |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |