Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 169, средняя оценка - 4.97
Диман56
22 / 22 / 4
Регистрация: 07.11.2011
Сообщений: 154
#1

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

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

Сейчас будет чистый мой тупняк. Слабонервным дальше не читать. Итак, для чего вообще нужны указатели? Я вот не пойму, зачем их надо было вообще придумывать??? Не понимаю их конкретной пользы, смысла. Кто-нибудь может по-человечески объяснить?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2011, 20:12
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Понимание для чего вообще нужны указатели? (C++):

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

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

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

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

Для чего нужны интерфейсы?
Объясните на пальцах для чего нужны интерфейсы, как я понял они описывают...

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

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

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

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

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


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

Ну то есть:

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

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

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

ты пишешь:

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

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

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

На самом деле МойМассив - это указатель, который указывает на кусок памяти, в котором живут другие указатели, которые уже в свою очередь указывают на строки.
1
Диман56
22 / 22 / 4
Регистрация: 07.11.2011
Сообщений: 154
12.11.2011, 23:34  [ТС] #44
Спасибо вам, все толково объяснено.
0
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
Ну а там, ещё годик другой пройдёт, и начнёшь говорить всем, что указатели - фуфло, и нафег они не нужны
Удачи.
1
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
13.11.2011, 07:59 #46
Лучший ответ Сообщение было отмечено как решение

Решение

С точки зрения прикладника указатели в С++, разумеется, не нужны. Поскольку у прикладника просто не встанет никогда такой задачи, в которой бы они понадобились. Но вот с точки зрения системщика без указателей не обойтись. Я уж не говорю о чистом С, но даже в С++, когда пишется какая-нибудь высокоуровневая обёртка над низкоуровневыми вещами - там указатели сплошь и рядом. Штука в том, что в джаве, например, сама виртуальная машина предоставляет прокладку между языком и средой (ОС) с исчерпывающим функционалом, и там нельзя сделать больше того, что разрешаете ВМ, но в то же время в большинстве случаев достаточно того, что она предоставляет. Потому там хватает высокоуровневых ссылок и сборщика мусора. С++ же язык с настолько широкими возможностями, что он предоставляет как написание программ на очень высоком уровне, так и низкоуровневое программирование, в котором без сырой работы с памятью никак.
Из всего этого вытекает, что нужность или ненужность указателей целиком и полностью зависит от того, на каком уровне пишет программист. И внутри всех языков, которые не предоставляют указатели в чистом виде, всё равно происходит работа с памятью, и всё равно есть указатели, от этого никуда не уйти. Не будь указателей в С - не появилась бы Джава.
4
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
13.11.2011, 08:39 #47
Цитата Сообщение от Диман56
Не понимаю их конкретной пользы, смысла.
указатель - удобный инструмент
легко сохранить адрес чего-нибудь, а потом туда обратиться, когда угодно
при передаче указателя передаётся только то количество байт, которое требуется для хранения одного адреса
благодаря этому массивы передаются в функции очень быстро, не делается копия всех элементов, чтобы просто его передать
чтобы передать массив в функцию, начиная не с того элемента, который стоит у него в начале, а со второго, нужно просто переместить указатель на второй элемент с помощью арифметической операции
1
ValeryLaptev
Эксперт С++
1049 / 828 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
13.11.2011, 10:43 #48
Диман56, память компьютера - это массив. Каждый элемент массива имеет номер. Начинается с нуля. В Интеле - это массив байтов.
Как ты понимаешь, номер - это целое число. Правильно его называть - адрес.
Для хранения номеров-адресов можно объявить переменную. Это и будет переменная - указатель. А храниться в ней будут адреса данных.
Как ты понимаешь, переменная - одна, а адреса в ней могут быть разные. Что дает нам доступ к разным переменным в памяти.
0
Диман56
22 / 22 / 4
Регистрация: 07.11.2011
Сообщений: 154
13.11.2011, 11:30  [ТС] #49
Bers, спасибо вам огромное!!! Со структурами уже приходилось работать, поэтому второй вариант для меня более приемлемый) Тем более, мне нужно записывать ещё кое-какие данные о файле, поэтому юзать буду структуру.
0
alex_x_x
бжни
2454 / 1660 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
13.11.2011, 15:36 #50
Цитата Сообщение от silent_1991 Посмотреть сообщение
С точки зрения прикладника указатели в С++, разумеется, не нужны. Поскольку у прикладника просто не встанет никогда такой задачи, в которой бы они понадобились.
не понял, в с++ обходится без указателей значительно сложнее, чем ими пользоваться
отказ от указателей заставляет использовать вещи посложнее
2
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
14.11.2011, 08:28 #51
alex_x_x, прикладной программист просто-напросто будет использовать библиотеки, в которых есть высокоуровневые обёртки для всего, что может ему понадобиться. В этих обёртках могут использоваться указатели (список, умный указатель и т.д.), но программисту об этом думать не приходится.
0
Bers
Заблокирован
14.11.2011, 09:10 #52
Цитата Сообщение от accept Посмотреть сообщение
указатель - удобный инструмент
легко сохранить адрес чего-нибудь, а потом туда обратиться, когда угодно
мина замедленного действия?
0
LosAngeles
Заблокирован
14.11.2011, 09:12 #53
silent_1991, в qt есть все обёртки, но их редко кто использует, в cool reader'е или smplayer их например нет. В qt деревья используются и отношения сын-предок для контроля ресурсами и временем жизни, но в итоге это всё равно выливается в интенсивном использовании указателей в коде
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
14.11.2011, 09:17 #54
Цитата Сообщение от Диман56 Посмотреть сообщение
Сейчас будет чистый мой тупняк. Слабонервным дальше не читать. Итак, для чего вообще нужны указатели? Я вот не пойму, зачем их надо было вообще придумывать???
Их не надо придумывать, проблематично как раз придумать, как обойтись без них.
0
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
14.11.2011, 10:21 #55
Цитата Сообщение от Bers
мина замедленного действия?
если контроль теряется, многие вещи могут вылиться во что-нибудь
чтобы не терять контроль, нужно писать небольшие процедуры
1
Bers
Заблокирован
14.11.2011, 10:26 #56
Цитата Сообщение от accept Посмотреть сообщение
если контроль теряется, многие вещи могут вылиться во что-нибудь
чтобы не терять контроль, нужно писать небольшие процедуры
тогда не говорите "когда угодно". говорите "когда можно".

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

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


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

или когда хочет - обращение к памяти, которую кто то уже освободил. Крэш.
0
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
14.11.2011, 11:39 #59
Цитата Сообщение от Bers
обращение к памяти, которую кто то уже освободил
а, типа какой-то другой программист ?
да, такое может быть
если код такой, что непонятно, на что указывает указатель
если же всё понятно, то при освобождении можно их обнулить
1
Bers
Заблокирован
14.11.2011, 11:43 #60
Цитата Сообщение от accept Посмотреть сообщение
а, типа какой-то другой программист ?
да, такое может быть
если код такой, что непонятно, на что указывает указатель
если же всё понятно, то при освобождении можно их обнулить
итого: пох на ивариант класса. Типа мы в теме, спаггети нам жрать не впервой!
0
14.11.2011, 11:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.11.2011, 11:43
Привет! Вот еще темы с решениями:

Для чего нужны файлы с расширением .h, .c?
Не подскажите, для чего нужен (.h) и (.c) файл? А (.cpp)? Я читал, что это...

.elf и для чего они нужны
Собственно сабж Почитал Вики, как-то для новичка не очень много прояснилось И...

Для чего нужны заголовочные файлы?
Ещё раз всем здрасьте , последний вопрос в котором я не могу разобраться - Для...

для чего нужны хеш таблицы?
для чего нужны хеш таблицы? если есть массивы )


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

Или воспользуйтесь поиском по форуму:
60
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru