Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.86/159: Рейтинг темы: голосов - 159, средняя оценка - 4.86
22 / 22 / 4
Регистрация: 07.11.2011
Сообщений: 154

Понимание для чего вообще нужны указатели?

12.11.2011, 20:12. Показов 34662. Ответов 112
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сейчас будет чистый мой тупняк. Слабонервным дальше не читать. Итак, для чего вообще нужны указатели? Я вот не пойму, зачем их надо было вообще придумывать??? Не понимаю их конкретной пользы, смысла. Кто-нибудь может по-человечески объяснить?
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.11.2011, 20:12
Ответы с готовыми решениями:

Для чего нужны указатели?
Кто может объяснить для чего нужны указатели и смысл их? в интернете одна муть и еще для чего нужно new delete

Для чего нужны указатели на функции?
для чего нужны эти указатели на функции... не проще ли вызвать саму функцию, чем заводить под нее указатель и им пользоваться...

Ссылки и указатели, для чего нужны те и другие?
Что такое ссылки? Что такое указатели? ДЛЯ чего служат те и другие?

112
Заблокирован
12.11.2011, 23:18
Студворк — интернет-сервис помощи студентам
C++
1
2
folders=new char* [FolderSum];
files=new char*[FileSum];
1
22 / 22 / 4
Регистрация: 07.11.2011
Сообщений: 154
12.11.2011, 23:20  [ТС]
Спасибо) попробую только завтра-второй час ночи уже. Спасибо за помощь. Ещё вопрос-а размер строки-то как в таком объявлении указывать?)
0
Заблокирован
12.11.2011, 23:32
Цитата Сообщение от Диман56 Посмотреть сообщение
Спасибо) попробую только завтра-второй час ночи уже. Спасибо за помощь. Ещё вопрос-а размер строки-то как в таком объявлении указывать?)
Указатель хранит адрес в памяти. Тип указателя - это тип объекта, который по этому адресу живет. Пока все просто.

Но тебе нужно понять ещё одну не очевидную вещь:

По адресу, на который указывает указатель может жить... другой указатель.

И этот другой указатель уже может указывать ещё куда то.


В твоём случае, строка это кусок памяти, который хранит кучку char`ов
Поэтому, можно считать, что указатель , который указывает на кусок памяти, который хранит чары - это и есть строка.

Ну то есть:

char* в твоём отдельно взятом случае можно считать строкой.
Можно даже сделать псевдоним для наглядности:

typedef char* String; //теперь String- это тот же самый char* но воспринимается, как "строка"

Тебе же нужно создать массив строк. Причем динамический.
Тебе нужно попросить систему выделить тебе память под несколько штук строк.

ты пишешь:

String* МойМассив = new String[количество строк];

это будит равносильно:

char** МойМассив = new char* [количество строк];

На самом деле МойМассив - это указатель, который указывает на кусок памяти, в котором живут другие указатели, которые уже в свою очередь указывают на строки.
1
22 / 22 / 4
Регистрация: 07.11.2011
Сообщений: 154
12.11.2011, 23:34  [ТС]
Спасибо вам, все толково объяснено.
0
Заблокирован
13.11.2011, 00:33
Напишу вдогонку. Завтра может быть прочитаешь.

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

Сложность такого проекта резко возрастает, соответственно количество потенциальных ошибок увеличивается.

Поэтому, старайся по возможности всегда избегать ситуаций, когда у тебя один указатель указывает на другой. В с++ для этого есть множество решений.

Один из самых простых вариантов - это замаскировать указатель так, что бы он воспринимался не как указатель, а как отдельный тип данных. Например "строка" - это строка, а не "массив чаров".
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
int main()
{
 
    //объявим всему миру,
    //что стековый массив чаров - это String,
    //в который влезет 255 символов
    typedef char String[255]; 
    
    
    //создадим массив String`ов (строк),
    //в который влезет 10 штук строк
 
    //Если бы не было typedef
    //Нам бы пришлось понимать это так:
    //Массив, в который влезет 10 штук других массивов, 
    //каждый из которых вмещает 255 символов.
    
    //Ты уже наверное догадался, что массив - 
    //это ничто иное, как указатель на свой первый элемент
 
    String* myArray= new String[10]; //сделали массив строк
    
    for(int i=0;i<10;++i)
    {
        //запишем данные в массив строк
        memcpy(myArray[i], "Привет, Мир!\0", sizeof(String) );   
        
        //прочитаем каждую строчку и выведем её на экран консоли
        std::cout<<myArray[i]<< std::endl; 
    }
 
    return 0;
}
Другой способ понижения сложности логики - это создание дополнительной сущности, которая инкапсулирует внутри себя знание об указателе:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
int main()
{
 
    //эту структуру очень просто понять. 
    //Правда ведь?
    struct String 
    {
        char Text[255];
    };
    
    //создаём десять штук таких структур
    String* myArray= new String[10]; 
 
    //Понять что такое структура String
    //И как создать массив структур
    //Намного проще, чем держать уме мысли об указателях,
    // которые указывают на указатели
    //Которые указывают на символы.
 
    //А все что проще - легче сделать
    //И меньше вероятность допустить ошибку
 
    for(int i=0;i<10;++i)
    {
        //запишем данные в массив строк
        memcpy(myArray[i].Text, "Привет, Мир!\0", sizeof(String) );   
        
        //прочитаем каждую строчку и выведем её на экран консоли
        std::cout<<myArray[i].Text<< std::endl; 
    }
 
    return 0;
}
Причем, во втором случае, твоя новая абстрактная сущность - суть новый тип данных.
Это класс. Его можно снабдить удобными методами обработки данных.

Можно сделать метод, который будит загружать данные в массив букв.
Можно сделать метод, который будит все буквы превращать в строчные, или в заглавные.
Ну и тп.

Если ты ещё чуть чуть пройдёшься в этом направлении, то начнешь понимать, что такое классы, оценишь удобства, которые они предоставляют программистам.
Ну а потом, ещё чуть чуть, и ты оценишь всю мощь и великолепие библиотеки STL
Ну а там, ещё годик другой пройдёт, и начнёшь говорить всем, что указатели - фуфло, и нафег они не нужны
Удачи.
1
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
13.11.2011, 07:59
Лучший ответ Сообщение было отмечено как решение

Решение

С точки зрения прикладника указатели в С++, разумеется, не нужны. Поскольку у прикладника просто не встанет никогда такой задачи, в которой бы они понадобились. Но вот с точки зрения системщика без указателей не обойтись. Я уж не говорю о чистом С, но даже в С++, когда пишется какая-нибудь высокоуровневая обёртка над низкоуровневыми вещами - там указатели сплошь и рядом. Штука в том, что в джаве, например, сама виртуальная машина предоставляет прокладку между языком и средой (ОС) с исчерпывающим функционалом, и там нельзя сделать больше того, что разрешаете ВМ, но в то же время в большинстве случаев достаточно того, что она предоставляет. Потому там хватает высокоуровневых ссылок и сборщика мусора. С++ же язык с настолько широкими возможностями, что он предоставляет как написание программ на очень высоком уровне, так и низкоуровневое программирование, в котором без сырой работы с памятью никак.
Из всего этого вытекает, что нужность или ненужность указателей целиком и полностью зависит от того, на каком уровне пишет программист. И внутри всех языков, которые не предоставляют указатели в чистом виде, всё равно происходит работа с памятью, и всё равно есть указатели, от этого никуда не уйти. Не будь указателей в С - не появилась бы Джава.
4
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
13.11.2011, 08:39
Цитата Сообщение от Диман56
Не понимаю их конкретной пользы, смысла.
указатель - удобный инструмент
легко сохранить адрес чего-нибудь, а потом туда обратиться, когда угодно
при передаче указателя передаётся только то количество байт, которое требуется для хранения одного адреса
благодаря этому массивы передаются в функции очень быстро, не делается копия всех элементов, чтобы просто его передать
чтобы передать массив в функцию, начиная не с того элемента, который стоит у него в начале, а со второго, нужно просто переместить указатель на второй элемент с помощью арифметической операции
1
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
13.11.2011, 10:43
Диман56, память компьютера - это массив. Каждый элемент массива имеет номер. Начинается с нуля. В Интеле - это массив байтов.
Как ты понимаешь, номер - это целое число. Правильно его называть - адрес.
Для хранения номеров-адресов можно объявить переменную. Это и будет переменная - указатель. А храниться в ней будут адреса данных.
Как ты понимаешь, переменная - одна, а адреса в ней могут быть разные. Что дает нам доступ к разным переменным в памяти.
0
22 / 22 / 4
Регистрация: 07.11.2011
Сообщений: 154
13.11.2011, 11:30  [ТС]
Bers, спасибо вам огромное!!! Со структурами уже приходилось работать, поэтому второй вариант для меня более приемлемый) Тем более, мне нужно записывать ещё кое-какие данные о файле, поэтому юзать буду структуру.
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
13.11.2011, 15:36
Цитата Сообщение от silent_1991 Посмотреть сообщение
С точки зрения прикладника указатели в С++, разумеется, не нужны. Поскольку у прикладника просто не встанет никогда такой задачи, в которой бы они понадобились.
не понял, в с++ обходится без указателей значительно сложнее, чем ими пользоваться
отказ от указателей заставляет использовать вещи посложнее
2
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
14.11.2011, 08:28
alex_x_x, прикладной программист просто-напросто будет использовать библиотеки, в которых есть высокоуровневые обёртки для всего, что может ему понадобиться. В этих обёртках могут использоваться указатели (список, умный указатель и т.д.), но программисту об этом думать не приходится.
0
Заблокирован
14.11.2011, 09:10
Цитата Сообщение от accept Посмотреть сообщение
указатель - удобный инструмент
легко сохранить адрес чего-нибудь, а потом туда обратиться, когда угодно
мина замедленного действия?
0
Заблокирован
14.11.2011, 09:12
silent_1991, в qt есть все обёртки, но их редко кто использует, в cool reader'е или smplayer их например нет. В qt деревья используются и отношения сын-предок для контроля ресурсами и временем жизни, но в итоге это всё равно выливается в интенсивном использовании указателей в коде
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.11.2011, 09:17
Цитата Сообщение от Диман56 Посмотреть сообщение
Сейчас будет чистый мой тупняк. Слабонервным дальше не читать. Итак, для чего вообще нужны указатели? Я вот не пойму, зачем их надо было вообще придумывать???
Их не надо придумывать, проблематично как раз придумать, как обойтись без них.
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
14.11.2011, 10:21
Цитата Сообщение от Bers
мина замедленного действия?
если контроль теряется, многие вещи могут вылиться во что-нибудь
чтобы не терять контроль, нужно писать небольшие процедуры
1
Заблокирован
14.11.2011, 10:26
Цитата Сообщение от accept Посмотреть сообщение
если контроль теряется, многие вещи могут вылиться во что-нибудь
чтобы не терять контроль, нужно писать небольшие процедуры
тогда не говорите "когда угодно". говорите "когда можно".

Вопрос: кто решает "когда можно"?

Упоротый алгоритм? Сама сущность? Или сам указатель, который оказался волшебным?


"если ты потерял контроль - ты можешь пострадать. Но система этого может даже не заметить"(ц)
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
14.11.2011, 11:31
Цитата Сообщение от Bers
тогда не говорите "когда угодно". говорите "когда можно".
когда угодно - это когда программист захочет
например, мы можем сохранить адрес символа в середине строки
но у этого символа нет имени, а указатель позволяет обратиться к нему, не проводя вычислений индекса
таких указателей можно создать сколько угодно, каждый знает свою позицию и у них удобные имена
0
Заблокирован
14.11.2011, 11:33
Цитата Сообщение от accept Посмотреть сообщение
когда угодно - это когда программист захочет
Когда он может - сторонние механизмы не дадут.

или когда хочет - обращение к памяти, которую кто то уже освободил. Крэш.
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
14.11.2011, 11:39
Цитата Сообщение от Bers
обращение к памяти, которую кто то уже освободил
а, типа какой-то другой программист ?
да, такое может быть
если код такой, что непонятно, на что указывает указатель
если же всё понятно, то при освобождении можно их обнулить
1
Заблокирован
14.11.2011, 11:43
Цитата Сообщение от accept Посмотреть сообщение
а, типа какой-то другой программист ?
да, такое может быть
если код такой, что непонятно, на что указывает указатель
если же всё понятно, то при освобождении можно их обнулить
итого: пох на ивариант класса. Типа мы в теме, спаггети нам жрать не впервой!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.11.2011, 11:43

Для чего нужны и зачем использовать smart-указатели?
В Страуструпе не нашел, кто подскжает где можно про них прочитать ?)

Что за драйвера такие, для чего они и нужны ли они вообще?
Что за драйвера такие, для чего они и нужны ли они вообще? 1 Intel SATA Preinstall driver (For AHCI / RAID Mode) Note: Press F6...

С чего начать для понимание PHP
Добрый день, прошу помощи по изучению веб программирования, на днях пришлось начать администрировать простой сайт на html, вспомнил время...

Указатели на указатели: для чего они могут понадобятся?
Изучаю C++, дошёл до указателей на указатели. Там пишут что эта тема не обязательна. Для чего они могут понадобятся?

Понимание звуковой волны , да и вообще волн в целом
Не могу связать в голове физическую модель звуковой волны (последовательное сгущение и разряжение воздуха) и графическую (синусоида) ....


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

Или воспользуйтесь поиском по форуму:
60
Закрытая тема Создать тему
Новые блоги и статьи
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru