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

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

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

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


Зачем их использовать? Можно же напрямую обратиться к чему-либо.
1
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.07.2016, 19:57
Ответы с готовыми решениями:

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

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

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

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

20
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,714
16.07.2016, 20:03 2
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
2664 / 2239 / 240
Регистрация: 03.07.2012
Сообщений: 8,141
Записей в блоге: 1
17.07.2016, 09:46 3
Цитата Сообщение от Михаилыч Посмотреть сообщение
Можно же напрямую обратиться к чему-либо.
1. Тогда придумай работу со списками без указателей.
2. Указатель занимает 2-8 байтов, а объект может занимать несколько килобайт (и содержать указатели на другие объекты).
3. Объект может быть один, а указателей на него - много.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
18.07.2016, 10:59 4
Цитата Сообщение от Михаилыч Посмотреть сообщение
Не могу понять синтаксис указателей. Понял, что это работа с адресами, что оператор & это адрес. А вот * как я понял, это объявление указателя. Но. Что в него записывать? Адрес? Значение переменной? Хоть убей-не понимаю. Объясните пожалуйста.
киллер-фича указателей в том,
что вы можете обращаться к объекту,
не зная его имени.

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


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

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

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

Решение

Рассмотрим упрощенную схему организации оперативной памяти машины. Память типичной машины представляет собой массив последовательно пронумерованных и проадресованных ячеек, с которыми можно работать по отдельности или связанными кусками. Применительно к любой 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
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
18.07.2016, 19:49 7
Цитата Сообщение от Jaxmackey Посмотреть сообщение
После описания указателю разрешено ссылаться только на объекты заданного типа.
На самом деле, указатель вообще не знает на что он "ссылается".
Тип указателя влияет на то, как будет интерпретирована память.
Например,
C++
1
2
int x = 10;
char *p = reinterpret_cast<char*>(&x);
В памяти объект типа int, однако на память, где лежит переменная 'x' "указывает" указатель типа char.
Всё использование p будет построено так, как будто в памяти лежит char, но это же не так
1
hoggy
18.07.2016, 19:50
  #8

Не по теме:

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

0
Croessmah
18.07.2016, 19:51
  #9

Не по теме:

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

0
hoggy
18.07.2016, 20:00
  #10

Не по теме:

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

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

А есть еще полезное применение у указателей ? Потому что кроме, как передачи параметров в функцию через ссылку или через указатель с последующим разыиминованием, вообще не понятно для чего же они нужны ?
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,714
15.09.2019, 09:01 12
Цитата Сообщение от 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
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
15.09.2019, 12:27 13
Итераторы здесь причем?
0
Azazel-San
15.09.2019, 12:40
  #14

Не по теме:

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

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

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

Может сложный пример, но куда проще будет с великом. Имея один велик на двоих, можно пользоваться по очереди. Имея два велика, можно один ломать - второй останеться цел.
0
70 / 47 / 5
Регистрация: 10.01.2017
Сообщений: 1,849
15.09.2019, 13:48 16
Цитата Сообщение от kitsoRik Посмотреть сообщение
Представь ситуацию...
А есть еще полезное применение у указателей ? Потому что кроме, как передачи параметров в функцию через ссылку или через указатель с последующим разыиминованием, вообще не понятно для чего же они нужны ?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
15.09.2019, 14:07 17
Optimus11, просто сядь и реализуй двусвязный список.
0
490 / 286 / 129
Регистрация: 30.10.2018
Сообщений: 1,309
15.09.2019, 14:10 18
Цитата Сообщение от Optimus11 Посмотреть сообщение
вообще не понятно для чего же они нужны ?
Блин, хорошо. А как ты будешь хранить данные в памяти? Ведь указатель указывает на ячейку в памяти, память которой не контролюеться стеком, т.к. это куча.

Представь ситуацию, у тебя одновременни 1000 процессов берут данные из памяти. Без указателей, они брали бы копии и все время создавали бы новые объекты, а с указателями они буду ссылаться на один объект.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
15.09.2019, 14:11 19
Цитата Сообщение от kitsoRik Посмотреть сообщение
1000 процессов
Цитата Сообщение от kitsoRik Посмотреть сообщение
они буду ссылаться на один объект
0
70 / 47 / 5
Регистрация: 10.01.2017
Сообщений: 1,849
15.09.2019, 14:15 20
Цитата Сообщение от kitsoRik Посмотреть сообщение
... с указателями они буду ссылаться на один объект.
Ссылатся то будут, но доступ одновременно иметь, как я понимаю не будут, для этого есть std atomic (для потоков) ?
0
15.09.2019, 14:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.09.2019, 14:15
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru