Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 169, средняя оценка - 4.97
Диман56
22 / 22 / 0
Регистрация: 07.11.2011
Сообщений: 154
12.11.2011, 20:12     Понимание для чего вообще нужны указатели? #1
Сейчас будет чистый мой тупняк. Слабонервным дальше не читать. Итак, для чего вообще нужны указатели? Я вот не пойму, зачем их надо было вообще придумывать??? Не понимаю их конкретной пользы, смысла. Кто-нибудь может по-человечески объяснить?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2011, 20:12     Понимание для чего вообще нужны указатели?
Посмотрите здесь:

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

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

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

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


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

Ну то есть:

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

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

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

ты пишешь:

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

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

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

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

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

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

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

Один из самых простых вариантов - это замаскировать указатель так, что бы он воспринимался не как указатель, а как отдельный тип данных. Например "строка" - это строка, а не "массив чаров".
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
Ну а там, ещё годик другой пройдёт, и начнёшь говорить всем, что указатели - фуфло, и нафег они не нужны
Удачи.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
13.11.2011, 07:59     Понимание для чего вообще нужны указатели? #46
Сообщение было отмечено автором темы, экспертом или модератором как ответ
С точки зрения прикладника указатели в С++, разумеется, не нужны. Поскольку у прикладника просто не встанет никогда такой задачи, в которой бы они понадобились. Но вот с точки зрения системщика без указателей не обойтись. Я уж не говорю о чистом С, но даже в С++, когда пишется какая-нибудь высокоуровневая обёртка над низкоуровневыми вещами - там указатели сплошь и рядом. Штука в том, что в джаве, например, сама виртуальная машина предоставляет прокладку между языком и средой (ОС) с исчерпывающим функционалом, и там нельзя сделать больше того, что разрешаете ВМ, но в то же время в большинстве случаев достаточно того, что она предоставляет. Потому там хватает высокоуровневых ссылок и сборщика мусора. С++ же язык с настолько широкими возможностями, что он предоставляет как написание программ на очень высоком уровне, так и низкоуровневое программирование, в котором без сырой работы с памятью никак.
Из всего этого вытекает, что нужность или ненужность указателей целиком и полностью зависит от того, на каком уровне пишет программист. И внутри всех языков, которые не предоставляют указатели в чистом виде, всё равно происходит работа с памятью, и всё равно есть указатели, от этого никуда не уйти. Не будь указателей в С - не появилась бы Джава.
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.11.2011, 08:39     Понимание для чего вообще нужны указатели? #47
Цитата Сообщение от Диман56
Не понимаю их конкретной пользы, смысла.
указатель - удобный инструмент
легко сохранить адрес чего-нибудь, а потом туда обратиться, когда угодно
при передаче указателя передаётся только то количество байт, которое требуется для хранения одного адреса
благодаря этому массивы передаются в функции очень быстро, не делается копия всех элементов, чтобы просто его передать
чтобы передать массив в функцию, начиная не с того элемента, который стоит у него в начале, а со второго, нужно просто переместить указатель на второй элемент с помощью арифметической операции
ValeryLaptev
Эксперт C++
1004 / 783 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
13.11.2011, 10:43     Понимание для чего вообще нужны указатели? #48
Диман56, память компьютера - это массив. Каждый элемент массива имеет номер. Начинается с нуля. В Интеле - это массив байтов.
Как ты понимаешь, номер - это целое число. Правильно его называть - адрес.
Для хранения номеров-адресов можно объявить переменную. Это и будет переменная - указатель. А храниться в ней будут адреса данных.
Как ты понимаешь, переменная - одна, а адреса в ней могут быть разные. Что дает нам доступ к разным переменным в памяти.
Диман56
22 / 22 / 0
Регистрация: 07.11.2011
Сообщений: 154
13.11.2011, 11:30  [ТС]     Понимание для чего вообще нужны указатели? #49
Bers, спасибо вам огромное!!! Со структурами уже приходилось работать, поэтому второй вариант для меня более приемлемый) Тем более, мне нужно записывать ещё кое-какие данные о файле, поэтому юзать буду структуру.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
13.11.2011, 15:36     Понимание для чего вообще нужны указатели? #50
Цитата Сообщение от silent_1991 Посмотреть сообщение
С точки зрения прикладника указатели в С++, разумеется, не нужны. Поскольку у прикладника просто не встанет никогда такой задачи, в которой бы они понадобились.
не понял, в с++ обходится без указателей значительно сложнее, чем ими пользоваться
отказ от указателей заставляет использовать вещи посложнее
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
14.11.2011, 08:28     Понимание для чего вообще нужны указатели? #51
alex_x_x, прикладной программист просто-напросто будет использовать библиотеки, в которых есть высокоуровневые обёртки для всего, что может ему понадобиться. В этих обёртках могут использоваться указатели (список, умный указатель и т.д.), но программисту об этом думать не приходится.
Bers
Заблокирован
14.11.2011, 09:10     Понимание для чего вообще нужны указатели? #52
Цитата Сообщение от accept Посмотреть сообщение
указатель - удобный инструмент
легко сохранить адрес чего-нибудь, а потом туда обратиться, когда угодно
мина замедленного действия?
LosAngeles
Заблокирован
14.11.2011, 09:12     Понимание для чего вообще нужны указатели? #53
silent_1991, в qt есть все обёртки, но их редко кто использует, в cool reader'е или smplayer их например нет. В qt деревья используются и отношения сын-предок для контроля ресурсами и временем жизни, но в итоге это всё равно выливается в интенсивном использовании указателей в коде
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.11.2011, 09:17     Понимание для чего вообще нужны указатели? #54
Цитата Сообщение от Диман56 Посмотреть сообщение
Сейчас будет чистый мой тупняк. Слабонервным дальше не читать. Итак, для чего вообще нужны указатели? Я вот не пойму, зачем их надо было вообще придумывать???
Их не надо придумывать, проблематично как раз придумать, как обойтись без них.
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
14.11.2011, 10:21     Понимание для чего вообще нужны указатели? #55
Цитата Сообщение от Bers
мина замедленного действия?
если контроль теряется, многие вещи могут вылиться во что-нибудь
чтобы не терять контроль, нужно писать небольшие процедуры
Bers
Заблокирован
14.11.2011, 10:26     Понимание для чего вообще нужны указатели? #56
Цитата Сообщение от accept Посмотреть сообщение
если контроль теряется, многие вещи могут вылиться во что-нибудь
чтобы не терять контроль, нужно писать небольшие процедуры
тогда не говорите "когда угодно". говорите "когда можно".

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

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


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

или когда хочет - обращение к памяти, которую кто то уже освободил. Крэш.
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
14.11.2011, 11:39     Понимание для чего вообще нужны указатели? #59
Цитата Сообщение от Bers
обращение к памяти, которую кто то уже освободил
а, типа какой-то другой программист ?
да, такое может быть
если код такой, что непонятно, на что указывает указатель
если же всё понятно, то при освобождении можно их обнулить
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.11.2011, 11:43     Понимание для чего вообще нужны указатели?
Еще ссылки по теме:

что такое векторы и для чего нужны!? C++
Для чего нужны интерфейсы? C++
C++ Для чего нужны и зачем использовать smart-указатели?

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

Или воспользуйтесь поиском по форуму:
Bers
Заблокирован
14.11.2011, 11:43     Понимание для чего вообще нужны указатели? #60
Цитата Сообщение от accept Посмотреть сообщение
а, типа какой-то другой программист ?
да, такое может быть
если код такой, что непонятно, на что указывает указатель
если же всё понятно, то при освобождении можно их обнулить
итого: пох на ивариант класса. Типа мы в теме, спаггети нам жрать не впервой!
Yandex
Объявления
14.11.2011, 11:43     Понимание для чего вообще нужны указатели?
Закрытая тема Создать тему
Опции темы

Текущее время: 23:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru