Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатели, Помогите разобраться с указателями 
:(
    Опции темы
Fritz
  Дата 20.3.2004, 11:55 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Люди помогите разобраться с указателями, зачем они ВООБЩЕ нужны а?
  Вверх
Mal Hack
Дата 20.3.2004, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 2
Всего: 261



Указатель сразу дает адрес ячейки в памяти, где находтся информация, а при использовании переменных сначала ищется в памяти имя переменной, а потом тот самый адрес.
Указатели используются в основном для работы с динамически изменяемыми массивами или в программах, где нужно постоянно чистить память из-за большого количества перебираемых данных. Плюс - это выходя для передачи или возврата неограниченного числа параметров в функцию, массива, короче...
PM ICQ   Вверх
bilbobagginz
Дата 20.3.2004, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 3
Всего: 317



кроме вышесказанного:
один из самых важных преимуществ указателей это, что они позволяют передавать данные по адресу а не по значению:
напр. если у нас есть массив с 10^10 ячеек, то можно просто передать его адрес в функцию, и не надо всю информацию перекачивать на каждый вызов этой функции.



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
mr.DUDA
Дата 20.3.2004, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



И ко всему прочему, могу добавить кучу своих комментариев в теме с таким же названием, находящейся в форуме чуть ниже smile.gif , благодаря Fritz-у, любезно продублировавшему свой вопрос в двух темах сразу...


--------------------
user posted image
PM MAIL WWW   Вверх
Guest
Дата 21.3.2004, 02:48 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











oops hehe.gif
  Вверх
necrom
Дата 4.8.2011, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 21.2.2011

Репутация: нет
Всего: нет



Подскажите по указателям вот такую тему.
Код

int *iptr=(int*) 2;

Почему в первом случае, будет 2
Код

cout<<"iptr= "<<iptr++<<endl;

А во втором, 6
Код

iptr++;
cout<<"iptr= "<<iptr<<endl;

И почему данный пример не будет работать при таком раскладе.
Код

cout<<"iptr= "<<*iptr<<endl;

Как я понял, здесь идёт приведения типа к указателю (int*), но вот дальше не понятки (
PM MAIL   Вверх
azesmcar
Дата 4.8.2011, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



necrom

Да уж, ник у тебя соответствует дате поднятой темы smile 

Цитата(necrom @  4.8.2011,  20:17 Найти цитируемый пост)
Почему в первом случае, будет 2

ты сам эту двойку присвоил, а постфиксный оператор ++ возвращает предыдущее значение.

Цитата(necrom @  4.8.2011,  20:17 Найти цитируемый пост)
А во втором, 6

потому что так работает арифметика указателей, + 1 на указателе прибавляет указателю число, равное размеру типа указателя, т.е. в данном случае размеру типа int, т.е. 4.

Цитата(necrom @  4.8.2011,  20:17 Найти цитируемый пост)
И почему данный пример не будет работать при таком раскладе.

Потому что ты пытаешься получить объект int, находящийся по адресу 2, а кто сказал, что этот адрес принадлежит тебе?
PM   Вверх
mes
Дата 4.8.2011, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Mal Hack @  20.3.2004,  20:22 Найти цитируемый пост)
Указатель сразу дает адрес ячейки в памяти, где находтся информация, а при использовании переменных сначала ищется в памяти имя переменной, а потом тот самый адрес.

а не пытаетесь ли Вы нас обмануть ?!

Добавлено через 1 минуту и 24 секунды
Цитата(azesmcar @  4.8.2011,  19:55 Найти цитируемый пост)
Да уж, ник у тебя соответствует дате поднятой темы 

упс.. а на дату я и не посмотрел smile

Добавлено через 3 минуты и 7 секунд
Цитата(mr.DUDA @  20.3.2004,  21:40 Найти цитируемый пост)
И ко всему прочему, могу добавить кучу своих комментариев в теме с таким же названием, находящейся в форуме чуть ниже 

добавлю ссылку: http://forum.vingrad.ru/topic-20101.html



--------------------
PM MAIL WWW   Вверх
necrom
Дата 4.8.2011, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 21.2.2011

Репутация: нет
Всего: нет



 smile  Не хотел просто поднимать новую тему.
А если читать дословно данную строчку int *iptrs= (int*) 2;
то это будет так: Указателю iptrs присвоить адрес памяти в котором записано 2?
А как ещё данную запись прочитать 0[&iptrs]? Нулевой элемент массива по данному адресу?

PM MAIL   Вверх
volatile
Дата 4.8.2011, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(necrom @  4.8.2011,  21:45 Найти цитируемый пост)
 если читать дословно данную строчку int *iptrs= (int*) 2;
то это будет так: Указателю iptrs присвоить адрес памяти в котором записано 2?

не совсем.
Указателю iptrs присвоить адрес памяти равной 2.
т.е сам адрес равен 2. Походу, это явно системная память. 
к тому же он не выравнен, а значит щаз придет сыроежка, и опять задолбает, что это вообще не адрес smile )


Цитата(necrom @  4.8.2011,  21:45 Найти цитируемый пост)
 как ещё данную запись прочитать 0[&iptrs]? 

0[&iptrs] это аналог записи &iptrs[0]
то есть это абсолютные синонимы. Означает адрес самого первого элемента массива.


PM MAIL   Вверх
necrom
Дата 5.8.2011, 02:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 21.2.2011

Репутация: нет
Всего: нет



Фух вроде разобрался, спасибо.
Ещё вот такой, надеюсь последний вопрос.
Код

int da = 0;
int ***ptr=new int **[50];
**ptr = &da;

Опять же, как правильно прочитать. И почему ошибка при записи?

Переменной ptr типа указателя, на указатель, на указатель типа int выделяется массив памяти из 50 элементов указателей, на указатель типа int.
Записываем адрес в указатель, на указатель.
Ошибка при записи потому, что не выделена память для указателя?
Код

**ptr = &da;

PM MAIL   Вверх
volatile
Дата 5.8.2011, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 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; // это то, что фактически происходит в этой строке


Короче говоря, прежде чем разименовывать указатель, нужно его проинициализировать.
Иначе вы обращаетесь по случайному адресу - мусору.

А вообще не заморачивайтесь с глубоко вложенными указателями, больше двух ** очень редко когда нужно.

PM MAIL   Вверх
necrom
Дата 5.8.2011, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 21.2.2011

Репутация: нет
Всего: нет



Аргх  smile  не понимаю данную строчку.
Код

int * my_pointer; // какой-то отдельный указатель
ptr[0] = &my_pointer; // инициализруем первый элемент выделенного массива.

my_pointer указывает же тоже на мусор. Мы берём адресс указателя указывающий на мусор и записываем в указатель ptr.
А, если рассматривать, то что будет творится в памяти. Предположим у нас есть адреса 0x1000 - 0x1032, то эти указатели будут выглядеть так?
И когда мы будем инициализировать первый элемент массива мы запишем 0xFFF (предполагая, что 0xFFF это адрес указателя my_pointer)
Код
Адрес     Значение
ячейки  переменной в
памяти     памяти
        +----------+
FFF     |  rnd adr |<-.
        +----------+  |
1000    |    FFF   |<-.
        +----------+  |
1001    |          |  |
        +----------+  |
1002    |          |  |
        +----------+  |
1003    |   1000   |--'
        +----------+  |
1004    |    ..    |  |
        +----------+  |
1005    |    ..    |  |
        +----------+  |
1006    |    ..    |  |
        +----------+  |
1007    |    ..    |  |
        +----------+  |
1008    |    ..    |  |
        +----------+  |
1009    |   1000   |--'
        +----------+  |
100A    |   1000   |  |
        +----------+  |
100B    |    ..    |  |
        +----------+  |
100C    |    ..    |  |
        +----------+  |
100D    |    ..    |  |
        +----------+  |
100E    |    ..    |  |
        +----------+  |
100F    |    ..    |--'
        +----------+


Это сообщение отредактировал(а) necrom - 5.8.2011, 18:10
PM MAIL   Вверх
volatile
Дата 5.8.2011, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(necrom @ 5.8.2011,  18:09)
Аргх  smile  не понимаю данную строчку.
Код

int * my_pointer; // какой-то отдельный указатель
ptr[0] = &my_pointer; // инициализруем первый элемент выделенного массива.

my_pointer указывает же тоже на мусор. Мы берём адресс указателя указывающий на мусор и записываем в указатель ptr.

да, в данной точке значение my_pointer есть мусор, но мы его значение не используем. Мы берем адрес my_pointer , а он точно определен, и записываем этот адрес в 0-ой элемент массива. Остальные 49 элементов в данном коде пока не проинициализированы.

PM MAIL   Вверх
volatile
Дата 5.8.2011, 23:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(necrom @  5.8.2011,  18:09 Найти цитируемый пост)
И когда мы будем инициализировать первый элемент массива мы запишем 0xFFF (предполагая, что 0xFFF это адрес указателя my_pointer)

да. все верно!

У нас массив указателей на указатели. То есть в каждый элемент нужно записать адрес какого-то указателя. И пока мы не запишем, разыменовывать элементы нельзя.

В 0-ой элемент мы записали адрес указателя, поэтому можно его разыменовать.
Цитата(volatile @  5.8.2011,  12:03 Найти цитируемый пост)
*ptr[0] = &da; // ну вот теперь можно.

в ptr[0] хранится адрес my_pointer, следовательно
*ptr[0] - это и есть my_pointer,
Цитата(volatile @  5.8.2011,  12:03 Найти цитируемый пост)
my_pointer = &da; // это то, что фактически происходит в этой строке


а остальные 49 элементов не инициализированы, и
например в ptr[1], или ptr[2],  хранится мусор, так как мы их не инициализировали пока, следовательно
*ptr[1] - это есть разыменование не иницилизированного указателя, т.е указателя указывающего неизвестно куда. и будет ошибка.

Не понятно что вам не понятно.  smile 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0628 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.