Форум программистов, компьютерный форум 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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.11.2011, 13:41     Понимание для чего вообще нужны указатели? #101
Да, кстати, число файлов ведь тоже не известно на этапе разработки, поэтому единственная возможность выдать список, не используя буферизацию только текущей позиции - использовать указатель на динамические данные. Но я не системщик и не знаю, как они делают. Может им как раз удобнее единственная альтернатива?

Добавлено через 1 минуту
Цитата Сообщение от diagon Посмотреть сообщение
Все совершают ошибки,
Согласен. Но не такие же! Все ошибки или хитрые, или ешё тупее.

Добавлено через 3 минуты
Цитата Сообщение от diagon Посмотреть сообщение
Ну, допустим, сделать программу для врачей, в которой можно будет онлайн редактировать информацию о пациентах.
Здесь два пути: готовая БД и своя подсистема хранения. Если готовая БД, то или указатель, или файловое смещение (а это по сути его аналог) уже использовано девелоперами БД, а это тоже прикладники, если своя подсистема хранения, то те же механизмы доступа ползут уже в твою приладу. Причём, БДешный курсор в любом случае нельзя сделать без динамических данных в ОЗУ, а для этого нужен указатель и библиотека его уже не спрячет.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
15.11.2011, 13:53     Понимание для чего вообще нужны указатели? #102
Цитата Сообщение от taras atavin Посмотреть сообщение
Да, кстати, число файлов ведь тоже не известно на этапе разработки, поэтому единственная возможность выдать список, не используя буферизацию только текущей позиции - использовать указатель на динамические данные. Но я не системщик и не знаю, как они делают. Может им как раз удобнее единственная альтернатива?
Даже если хранить информацию о всех файлах, указатели нервно курят в сторонке.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <boost/filesystem.hpp>
#include <vector>
#include <iterator>
 
namespace fs = boost::filesystem;
 
int main()
{
    std::vector< fs::path > files;
    std::copy( fs::directory_iterator( fs::current_path() ), fs::directory_iterator(), std::back_inserter(files) );
    
    for ( auto file : files)
        std::cout << file << std::endl;
}
Результат: http://liveworkspace.org/code/3753bc...0a30290e6e3daf


Цитата Сообщение от taras atavin Посмотреть сообщение
Если готовая БД, то или указатель
Ну, во-первых, можно использовать умные указатели(обертка над обычными), во-вторых
Цитата Сообщение от diagon Посмотреть сообщение
При этом база данных на каком-нибудь сервере лежать будет.
Т.е. все будет делаться через запросы.
silent_1991
15.11.2011, 13:55
  #103

Не по теме:

Цитата Сообщение от taras atavin Посмотреть сообщение
В любой же реальной задаче будет текст, состящий из заранее не известного числа не только символов, но и строк, заранее не известный размер статистической выборки, или матрицы коэффициентов системы уравнений, математическое выражение неизвестной длины или ещё какая пакость, требующая динамического выделения памяти.
Ааа, я и забыл, ведь СТЛ теперь вне закона...

taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.11.2011, 14:04     Понимание для чего вообще нужны указатели? #104
Цитата Сообщение от silent_1991 Посмотреть сообщение
Ааа, я и забыл, ведь СТЛ теперь вне закона...
Почему?

Добавлено через 3 минуты
Цитата Сообщение от diagon Посмотреть сообщение
Ну, во-первых, можно использовать умные указатели(обертка над обычными), во-вторых
И где же я предложил вытаскивать на глобальный уровень именно обычные? Есть обёртка и ты хочешь её использовать? Эйси. Изучи, потом используй, а то не хватало ещё из-за этой обёртки какой нибудь кривоинтерпретации. Кстати, как stl подружить со своими типами?

Добавлено через 2 минуты
Цитата Сообщение от diagon Посмотреть сообщение
Т.е. все будет делаться через запросы.
На каждую отдельную запись? Ну ну. Делай, а я посмотрю, сколько часов в день будет висеть сеть, а сколько секунд в месяц - работать прилада. Если же сервер оперирует целыми выборками, то куда ты ушёл? Ну для готовой БД всё прячется в саму БД и в компоненты доступа (а может и формы самой БД предложишь пользователю? Тоже вариант). Я сейчас делаю приладу, использующую ACCES и явные указатели в ней только на кэнвэсы, других нет и не будет. Только ACCES - не драйвер и не операционная система.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
15.11.2011, 14:07     Понимание для чего вообще нужны указатели? #105
taras atavin, Что значит как подружить? Конкретнее пожалуйста. Впринципе ты прав. В любом случае в С++ используются указатели. Но вот одно дело использовать их самому - другое дело работать через высокоуровневый интерфейс реализация которого, кроме документации, тебя абсолютно не волнует.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
15.11.2011, 14:16     Понимание для чего вообще нужны указатели? #106
Цитата Сообщение от taras atavin Посмотреть сообщение
И где же я предложил вытаскивать на глобальный уровень именно обычные?
Контекст темы именно в этом.

Цитата Сообщение от taras atavin Посмотреть сообщение
Кстати, как stl подружить со своими типами?
C++
1
vector< твой_тип >

Цитата Сообщение от taras atavin Посмотреть сообщение
На каждую отдельную запись? Ну ну. Делай, а я посмотрю, сколько часов в день будет висеть сеть, а сколько секунд в месяц - работать прилада.
Ну, я не знаком с веб-программированием, факт в том, что бд(не самописная) лежит на сервере, и общаться с ней придется через сокеты. А для сокетов есть довольно много оберток.

Цитата Сообщение от ForEveR Посмотреть сообщение
В любом случае в С++ используются указатели.
Кто бы спорил.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.11.2011, 14:17     Понимание для чего вообще нужны указатели? #107
Цитата Сообщение от ForEveR Посмотреть сообщение
Но вот одно дело использовать их самому - другое дело работать через высокоуровневый интерфейс реализация которого, кроме документации, тебя абсолютно не волнует.
Ты где у меня видел рекомендацию вытащить явные указатели на самый верх? Я как раз призываю их прятать как можно глубже, читай:
Мораль всей басни такова: указатели необходимы..., но используя их надо все указатели прятать в классы.
Я только не верю, что это всегда будут готовые классы. И здесь вроде упоминалась проблема, связанная с тем, что вектор ни кого не предупреждал о реаллоке.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.11.2011, 14:21     Понимание для чего вообще нужны указатели? #108
Цитата Сообщение от taras atavin Посмотреть сообщение
Почему?
Потому что это сарказм. А сарказм это потому, что вы приводите доводы в пользу указателей, перечисляя вещи, которые даже в стл есть, не говоря о куче других сторонних специализированных библиотек.
bob2005
0 / 0 / 0
Регистрация: 10.11.2011
Сообщений: 10
15.11.2011, 15:23     Понимание для чего вообще нужны указатели? #109
Нужно в шапку тему поднять! Для новичков будет полезно этот холивар почитать.
Диман56
22 / 22 / 0
Регистрация: 07.11.2011
Сообщений: 154
15.11.2011, 15:28  [ТС]     Понимание для чего вообще нужны указатели? #110
Вот-вот. Про холивар-это точно. Вроде разобрался, а холивара развели...
Elfenlide
23 / 23 / 1
Регистрация: 15.04.2012
Сообщений: 183
21.04.2012, 10:23     Понимание для чего вообще нужны указатели? #111
Цитата Сообщение от mc.Duck Посмотреть сообщение
//на что указывает переменная "a"? На последний элемент цикла , //тобеш на элемент девятого шага //но память то мы заняли и под остальные 9 элементов. //А вот как их теперь удалить?
это делаеться вот так:
C++
1
2
3
4
5
6
7
8
9
10
char *a = NULL;          //здесь объявляем переменную-указатель
for(int i=0;i<=9;i++)    //цикл присваиваний значений
{
a[i]=new char[100];
}    
for (int i=0;i<=9;i++)
    {
    delete[]a[i];
        }
    delete[]a;
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.04.2012, 13:12     Понимание для чего вообще нужны указатели? #112
Цитата Сообщение от Диман56 Посмотреть сообщение
Сейчас будет чистый мой тупняк. Слабонервным дальше не читать. Итак, для чего вообще нужны указатели? Я вот не пойму, зачем их надо было вообще придумывать??? Не понимаю их конкретной пользы, смысла. Кто-нибудь может по-человечески объяснить?
Указателем называется данное специального вида, используемое для хранения адреса подпрограммы, или другого данного. В том числе, он может хранить и адрес другого указателя. Сами указатели обычно целые, а адреса есть номера байтов. Всякая переменная в памяти есть ячейка по некоторому адресу, но этот адрес может валяться и в коде программы.
C++
1
2
int a;
a=10; // Здесь в ячейку памяти пишется значение, но сделать это можно и так: asm {MOV <адрес a>,10
. Это прямая адресация, адрес данного валяется в самой команде. Также можно поступить и при адресации поля структуры и при адресации элемента статического массива через константный индекс. Но так нельзя делать, если адрес не известен на этапе компиляции, а он не может быть известен на этапе компиляции, если индекс надо взять из данного, например, из счётчика цикла. В этом случае адрес надо вычислить. Значит задача: массив занимает n ячеек памяти подряд размером s байт каждая, начиная с байта номер a, первая ячейка массива хранит элемент с индексом 0, остальные элементы располагаются в порядке возрастания индексов, надо вычислить адрес adress ячейки, хранящей элемент с индексом i. Адрес этой ячейки вычисляется по формуле: adress=a+i*s. Для этого уже придётся загружать a в регистр, как данное и вычислять adress путём алгебраических операций. А для этого его уже придётся где то хранить в виде данного, а не как часть программы. Как вариант - в сегменте кода, но всё таки это данное. Пришли к указателю. В паскале вся эта арифметика указателей при обращении к элементам массивов просто спрятана в реализацию операторов, на сях она спрятана не до конца, так как структура массива описана в стандарте и объявлена эквивалентность
C++
1
a+20=10;
,
C++
1
a[20]=10;
,
C++
1
p[20]=10;
и
C++
1
p+20=10;
при
C++
1
2
3
int a[10];
int *p;
p=a;
.

Добавлено через 6 минут
Динамические же массивы, деревья, списки, стеки, очереди, графы и любые другие динамические контейнеры вообще нельзя делать без явных указателей на уровне абстракции исходного кода самих контейнеров. В c# из-за этого нельзя создавать свои контейнеры, можно только пользоваться готовыми шаблонами контейнерных типов, какие сочли нужными в мелкософте. Но ведь мелкомягкие не боги, они не могут предусмотреть всего. Программистская мысль должна развиваться и в первую очередь в области проектирования контейнеров, а зарешёченные развиваться не могут, им все программы диктует стандарт мелкософта, шаг влево/шаг вправо считается побег, прыжок на месте - попытка улететь, ось давит сверху без предупреждения.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2012, 13:57     Понимание для чего вообще нужны указатели?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
21.04.2012, 13:57     Понимание для чего вообще нужны указатели? #113
Цитата Сообщение от taras atavin Посмотреть сообщение
В c# из-за этого нельзя создавать свои контейнеры
Да ну?
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
using System;
 
class LinkedList<T>
{
    private class LinkedListNode
    {
        public T mData;
 
        public LinkedListNode mNext;
        public LinkedListNode mPrev;
 
        public LinkedListNode()
        {
            mNext = null;
            mPrev = null;
        }
 
        public LinkedListNode(T data)
        {
            mData = data;
 
            mNext = null;
            mPrev = null;
        }
    }
 
    private LinkedListNode mHead;
    private LinkedListNode mTail;
 
    public LinkedList()
    {
        mHead = mTail = new LinkedListNode();
    }
 
    public void PushBack(T data)
    {
        LinkedListNode node = new LinkedListNode(data);
 
        if (mHead.mNext == null)
        {
            mHead = node;
 
            mHead.mNext = mTail;
            mTail.mPrev = mHead;
        }
        else
        {
            node.mPrev = mTail.mPrev;
            node.mNext = mTail;
 
            mTail.mPrev.mNext = node;
            mTail.mPrev = node;
        }
    }
 
    public void Print()
    {
        for (LinkedListNode n = mHead; n != mTail; n = n.mNext)
            Console.WriteLine(n.mData.ToString());
    }
}
 
class Program
{
    public static void Main()
    {
        LinkedList<int> list = new LinkedList<int>();
 
        list.PushBack(10);
        list.PushBack(20);
        list.PushBack(30);
 
        list.Print();
    }
}
Yandex
Объявления
21.04.2012, 13:57     Понимание для чего вообще нужны указатели?
Закрытая тема Создать тему
Опции темы

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