С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/79: Рейтинг темы: голосов - 79, средняя оценка - 4.72
14 / 1 / 0
Регистрация: 16.07.2016
Сообщений: 19

Зачем нужны указатели

16.07.2016, 19:57. Показов 16589. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не могу понять синтаксис указателей. Понял, что это работа с адресами, что оператор & это адрес. А вот * как я понял, это объявление указателя. Но. Что в него записывать? Адрес? Значение переменной? Хоть убей-не понимаю. Объясните пожалуйста.


Зачем их использовать? Можно же напрямую обратиться к чему-либо.
1
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.07.2016, 19:57
Ответы с готовыми решениями:

Зачем нужны все эти указатели (или не указатели)
Зачем надо DWORD, HANDLE, LPVOID?

Указатели на слонов или А зачем нужны указатели?
Знаю что таких вопросов было уйма, но я так и не нашел ответа на свой вопрос. Для чего нужны указатели? Что такое указатели я знаю, это...

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

20
Модератор
Эксперт С++
 Аватар для zss
13770 / 10963 / 6491
Регистрация: 18.12.2011
Сообщений: 29,240
16.07.2016, 20:03
C++
1
2
3
4
int* pa; // объявление указателя
int a=100500;
pa=&a; // присваивание указателю адреса переменной
int b = *pa; // разыменование указателя и присваивание переменной b значения хранящегося по адресу pa, т.е. 100500
Указатели можно использовать для изменения значений передаваемых в параметрах функции:
C++
1
2
3
4
5
6
void swap(int* pa,int* pb) // передаем адреса
{
   int t= *pb; // берем то, что лежит по адресу pb
   *pb=*pa; // записываем  по адресу pb то, что лежит по адресу pa
   *pa=t; // записываем по адресу pa то, что раньше лежало по адресу pb
}
0
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
17.07.2016, 09:46
Цитата Сообщение от Михаилыч Посмотреть сообщение
Можно же напрямую обратиться к чему-либо.
1. Тогда придумай работу со списками без указателей.
2. Указатель занимает 2-8 байтов, а объект может занимать несколько килобайт (и содержать указатели на другие объекты).
3. Объект может быть один, а указателей на него - много.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
18.07.2016, 10:59
Цитата Сообщение от Михаилыч Посмотреть сообщение
Не могу понять синтаксис указателей. Понял, что это работа с адресами, что оператор & это адрес. А вот * как я понял, это объявление указателя. Но. Что в него записывать? Адрес? Значение переменной? Хоть убей-не понимаю. Объясните пожалуйста.
киллер-фича указателей в том,
что вы можете обращаться к объекту,
не зная его имени.

в указателе хранится адрес объекта,
и зная этот адрес можно получить доступ к самому объекту.


для чего это может быть нужно?

например, что бы была возможность работать не с каким то конкретным объектом,
а с любым, адрес которого нам дали.

в указатель мы можем подсовывать адреса самых разных объектов.
и одна и таже функция сможет обработать эти объекты,
0
 Аватар для MaGaponov
11 / 11 / 9
Регистрация: 01.07.2015
Сообщений: 85
18.07.2016, 11:00
http://cppstudio.com/post/423/ читайте, потом нам расскажете
0
 Аватар для Jaxmackey
5 / 5 / 2
Регистрация: 04.10.2013
Сообщений: 142
18.07.2016, 18:39
Лучший ответ Сообщение было отмечено Михаилыч как решение

Решение

Рассмотрим упрощенную схему организации оперативной памяти машины. Память типичной машины представляет собой массив последовательно пронумерованных и проадресованных ячеек, с которыми можно работать по отдельности или связанными кусками. Применительно к любой 16-разрядной и 32-разрядной машине верны следующие утверждения:
- один байт может хранить значение типа char;
- двухбайтовая ячейка может рассматриваться как целое типа short;
- четырехбайтовая - как целое типа long.
Указатель - это группа ячеек, в которых может храниться адрес. Например, пусть переменная ch имеет тип char, ptrch - указатель, ссылающийся на переменную ch.

В Си имеется унарная операция & - операция получения адреса. Запись вида
C++
1
ptrch = &ch;
присваивает адрес ячейки, где находится переменная ch переменной ptrch, которая является переменной указателем. В этом случае принято говорить: ptrch указывает на ch, или, что одно и то же, ptrch ссылается на ch.
Правила: 1. Операция получения адреса & применяется только к объектам,
расположенным в памяти, а именно к переменным и элементам
массивов.
2. Ее операндом не может быть ни выражение, ни константа, ни
регистровая переменная.
Унарная операция * есть операция раскрытия ссылки. (Другие названия: операция разадресации, операция косвенной адресации). Эта операция применяется к указателю и выдает объект, на который данный указатель ссылается.
Приведем следующие записи:
C++
1
2
3
4
5
6
int x=1, y=2, z[10]; /* описание переменных и массива */
    int *pint;           /* описание указателя на тип int */
    pint=&x;             /* теперь pint указывает на х*/ 
    y= *pint;            /* y теперь равен х, то есть 1 */
    *pint=0;             /* х теперь обнуляется */
    pint= &z[0];         /* pint теперь указывает на z[0] */
Таким образом, описание переменной как указателя, аналогично описанию обычной переменной с добавлением символа (*) перед именем переменной.
Приведем примеры правильного описания указателей:
C++
1
2
3
4
int *pint;
     char *pchar;
     float *pfloat, *ptf;
     double *pdb;
После описания указателю разрешено ссылаться только на объекты заданного типа. Исключение составляет указатель на тип void, который может ссылаться на объекты любого типа. Но к такому указателю нельзя применять оператор разадресации.
Замечание: При выводе на экран или печать значения указателя с помощью
функции printf() необходимо пользоваться спецификацией
преобразования %u, поскольку значением указателя является адрес -
целое число без знака.
1
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
18.07.2016, 19:49
Цитата Сообщение от Jaxmackey Посмотреть сообщение
После описания указателю разрешено ссылаться только на объекты заданного типа.
На самом деле, указатель вообще не знает на что он "ссылается".
Тип указателя влияет на то, как будет интерпретирована память.
Например,
C++
1
2
int x = 10;
char *p = reinterpret_cast<char*>(&x);
В памяти объект типа int, однако на память, где лежит переменная 'x' "указывает" указатель типа char.
Всё использование p будет построено так, как будто в памяти лежит char, но это же не так
1
18.07.2016, 19:50

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
На самом деле, указатель вообще не знает на что он "ссылается".
я ж вам говорил.
статью пишите свою,внатуре блин ваааще

0
18.07.2016, 19:51

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
я ж вам говорил.
статью пишите свою,внатуре блин ваааще
Предлагаете поторопиться?
Думаю, что не стоит этого делать,
а то насмешить можно людей :)

0
18.07.2016, 20:00

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
Предлагаете поторопиться?
нет нет.
просто обращаю ваше внимание,
что вопрос актуальный.
и ответы на него - полезны для Индустрии.

0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
14.09.2019, 23:59
Цитата Сообщение от Михаилыч Посмотреть сообщение
Зачем их использовать? Можно же напрямую обратиться к чему-либо.
[QUOTE=ZSS;9375747Указатели можно использовать для изменения значений передаваемых в параметрах функции[/QUOTE]

А есть еще полезное применение у указателей ? Потому что кроме, как передачи параметров в функцию через ссылку или через указатель с последующим разыиминованием, вообще не понятно для чего же они нужны ?
0
Модератор
Эксперт С++
 Аватар для zss
13770 / 10963 / 6491
Регистрация: 18.12.2011
Сообщений: 29,240
15.09.2019, 09:01
Цитата Сообщение от Optimus11 Посмотреть сообщение
для чего же они нужны ?
Ну, например, обычный указатель:
C++
1
2
3
4
5
int x[N];
....
char* p;
for(p=x;p<x+N;++p)
  cout<<*p;
Обобщенный указатель (итератор):
C++
1
2
3
4
vector<int> v;
...
for(vector<int>::iterator p=v.begin();p!=v.end();++p)
   cout<<*p;
Вообще, контейнерные классы и итераторы - это как
"Ленин и партия".
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
15.09.2019, 12:27
Итераторы здесь причем?
0
15.09.2019, 12:40

Не по теме:

Croessmah, все ещё жду статью по указателях от тебя))0
зы - кста раньше hoggy был более вежливым)

0
490 / 286 / 129
Регистрация: 30.10.2018
Сообщений: 1,309
15.09.2019, 12:48
Цитата Сообщение от Optimus11 Посмотреть сообщение
вообще не понятно для чего же они нужны ?
Представь ситуацию. Учишся ты в школе, но учебни к по истории забыл дома, сосед по парте конечно же с тобой поделиться. Выходит что вы читаете из одной книги, но вдруг сосед по парте пошел к доске, у тебя есть время рисовать в книге что угодно, как только друг прийдет, он увидит это все, и выходит что ты рисовал ему по книге - вот это и есть указатели, вы двое видите одну книгу.

А теперь представь, что он тебе дал копию учебника, сколько не рисуй, книга твоего соседа останеться прежней - вот это уже работа с копией.

Может сложный пример, но куда проще будет с великом. Имея один велик на двоих, можно пользоваться по очереди. Имея два велика, можно один ломать - второй останеться цел.
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
15.09.2019, 13:48
Цитата Сообщение от kitsoRik Посмотреть сообщение
Представь ситуацию...
А есть еще полезное применение у указателей ? Потому что кроме, как передачи параметров в функцию через ссылку или через указатель с последующим разыиминованием, вообще не понятно для чего же они нужны ?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
15.09.2019, 14:07
Optimus11, просто сядь и реализуй двусвязный список.
0
490 / 286 / 129
Регистрация: 30.10.2018
Сообщений: 1,309
15.09.2019, 14:10
Цитата Сообщение от Optimus11 Посмотреть сообщение
вообще не понятно для чего же они нужны ?
Блин, хорошо. А как ты будешь хранить данные в памяти? Ведь указатель указывает на ячейку в памяти, память которой не контролюеться стеком, т.к. это куча.

Представь ситуацию, у тебя одновременни 1000 процессов берут данные из памяти. Без указателей, они брали бы копии и все время создавали бы новые объекты, а с указателями они буду ссылаться на один объект.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
15.09.2019, 14:11
Цитата Сообщение от kitsoRik Посмотреть сообщение
1000 процессов
Цитата Сообщение от kitsoRik Посмотреть сообщение
они буду ссылаться на один объект
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
15.09.2019, 14:15
Цитата Сообщение от kitsoRik Посмотреть сообщение
... с указателями они буду ссылаться на один объект.
Ссылатся то будут, но доступ одновременно иметь, как я понимаю не будут, для этого есть std atomic (для потоков) ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.09.2019, 14:15
Помогаю со студенческими работами здесь

Зачем нужны многоуровневые указатели
вопрос в названии темы

Зачем здесь нужны указатели
1. Через указатели на указатели посчитать сумму двух чисел и записать в третье. 2. Написать примитивный калькулятор, пользуясь только...

Не могу понять зачем нужны указатели?
Не как не могу понять зачем нужны указатели. Я знаю что их надо использовать для выделения памяти, но раньше я и без них обходился

Тема указатели, зачем они нужны
Для чего придумали указатели.... Добавлено через 1 минуту для того, что бы передавать адрес туда сюда?

Объясните, пожалуйста, зачем в C++ нужны указатели
Никак что-то не пойму, зачем в C++ указатели? Ведь можно спокойно программировать без них.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru