14 / 14 / 6
Регистрация: 26.11.2010
Сообщений: 235
1

Указатели

02.04.2011, 20:08. Показов 1824. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Прошу ответить на мои вопросы:
1)Как понять, когда именно нужно использовать указатели? Т.е. когда без них невозможно.
2)Это вопрос уже к про). Даже не знаю, как его сформулировать. Когда вы поняли, что поняли указатели, и знаете, как и, где их использовать? Сколько по времени заняло это?
Вот у меня дана функция:
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
char *step(char *p, char *&out){
 
int n=0; char *q;
 
while(*p>= '0' && *p<= '9')                      // Накопление константы
n=n*10+ *p++ - '0' ;
 
if (n==0) n=1;                                        // При отсутствии n=1
 
while(n--!=0){                                         // Цикл повтора фрагмента
 
for(q=p; *q!=0 && *q!=')'; q++)
{
if (*q!= '(' )                   // Цикл посимвольного копирования
 
*out++ = *q;               // Все, кроме ( копировать
 
else {
 
q++;                  // Пропустить (
 
q=step(q,out);   // Рекурсия для вложенного фрагмента
 
}
 
}}
 
if (*q== ')' ) q++; 
return q;
}
Зачем указатель в определении ф-ции? Или вот здесь char *p, char *&out.
Прошу помощи, указатели - больная тема =(
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.04.2011, 20:08
Ответы с готовыми решениями:

Указатели и указатели на указатели, а также типы данных
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно....

Почему Лафоре использует указатели на указатели, вместо обмена значениями указателей?
Доброго времени суток! Задался теоретическим вопросом. Читал пример из книги Лафоре...

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

Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов?
Есть массив int **mas; mas=new int*; // выделил место под пять строк, верно ? mas=new int;//...

20
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
02.04.2011, 21:14 2
понял указатели автоматически, когда прочитал про массивы и их расположение в памяти.
чаще использую при передаче данных в функцию.
1
14 / 14 / 6
Регистрация: 26.11.2010
Сообщений: 235
02.04.2011, 21:21  [ТС] 3
Цитата Сообщение от no0ker Посмотреть сообщение
понял указатели автоматически, когда прочитал про массивы и их расположение в памяти.
чаще использую при передаче данных в функцию.
Блин, мы проходим уже бинарные деревья, а для меня указатели до сих пор "нечто". Ну не то чтобы совсем, но всё равно не до конца понимаю..
А для чего они в моём примере используются?
0
65 / 71 / 9
Регистрация: 25.06.2009
Сообщений: 244
02.04.2011, 23:12 4
представь что переменная это ящик, у которого есть номер и в котором что то лежит,
указатели хранят в себе номер ящика совершенно другой переменной,

передав этот номер какой то функции она может менять то что лежит в ящике,
а передав то что лежит в ящике она сможет этим пользоваться, но изменить это именно там откуда это пришло она не сможет, так как не знает адреса
1
41 / 41 / 9
Регистрация: 28.01.2011
Сообщений: 175
02.04.2011, 23:20 5
А я всегда представлял память компьютера, как список битов (или байтов).
Например, вот кусок:

101 - 12
102 - H
103 - i
104 - !
105 - 5
Это память. Для нас пока что ничего полезного.
Но когда, допустим, процессор обращается к ней с позиции 102 длиной 3 - мы получаем "Hi!".
Стоит только немного ошибиться - например, дать длину 4, мы получим "Hi!5" (5 - мусор).
1
101 / 101 / 15
Регистрация: 04.02.2010
Сообщений: 162
02.04.2011, 23:33 6
Еще указатели нужны для работы с динамической памятью.
1
1183 / 468 / 87
Регистрация: 23.06.2009
Сообщений: 6,390
03.04.2011, 00:00 7
сам не про, но вижу две причины.
1.передать ссылку на фото будет легче, чем передать само фото с размером 20мб.
Думаю пример поняли.
2.Скажем есть функция, которая находит максимальный элемент из списка,а так же его местоположение. Как знаем, функция возвращает один параметр(с помощью return), но с помощью указателей можно возвращать хотя сто.
1
377 / 228 / 79
Регистрация: 24.11.2009
Сообщений: 695
03.04.2011, 07:21 8
1)Как понять, когда именно нужно использовать указатели? Т.е. когда без них невозможно.
Когда они упрощают жизнь.=) Не могу назвать ни одного примера с указателелями, который невозможно было бы сделать без их использования. (Но это вполне может быть вызвано спецификой решаемых задач.)
указатели лишь инструмент, и выбор чем вкрутить саморез - шуруповертом или отверткой - за Вами. Пожалуй, наиболее часто указатели используются для передачи объектов без их копирования:
C++
1
2
3
4
5
6
7
8
9
double tratata(int* ptr);
 
int some_func(){
int array1 [100500];
    //do somethig...
    double result = tratata(array1); //передача массива в tratata с помощью указателя
 
return result;
}
2)Это вопрос уже к про). Даже не знаю, как его сформулировать. Когда вы поняли, что поняли указатели, и знаете, как и, где их использовать? Сколько по времени заняло это?
увы не про. Неделю или две на минимальном уровне после связных списков.

Вы писали что проходите структуры данных. Напишите своё бинарное дерево (или реализацию стэка)- многие вопросы отпадут.
зы: написать - иметь компилируемый код, верно работающий с хотя бы с тестовыми примерами.
1
50 / 4 / 0
Регистрация: 02.04.2011
Сообщений: 60
03.04.2011, 10:42 9
Из-за недостатка знаний обращаюсь к вам, к людям которые имеют навык в программировании. Приступил к изучению недавно, как говорится для души, не знаю нравится мне это и все тута. Много вопросов, но видимо пока соображалка не оч работает. Вот для тренеровки выдумал задачку
И выполнил в массиве, через индексацию элементов.
// in dev 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
#include <iostream> 
#include <cstdio>
using namespace std;
 int main()
{ 
    cout << " \n                   Для выхода из программы введите '+'" << " \n ";
    cout << "\n";
    cout << "          Для работы программы введите символ, слово или предложение " << " \n ";
    
    char mas[]={};
     
    while (*mas!= '+') /*  Здесь я применил указатель на первый элемент строки и видимо
   на этом мое понимание об указателях ограничилось.
*/ 
    {
           gets(mas);
            
    for (int i=0; mas[i]!= '\0'; i++ )
    { 
         if (mas[i]=='.')
    {
        { cout << "содержится точка -> в " ;break;}
               
        }}
           cout << mas << " \n";
         }
           cout << "ВЫ ввели плюс. Нажмите Enter" << endl;
        
    cin.get();
  
        }
а до указателей не допетю, хоть головой об стену. Не получается переходить в цикле от нулевого элемента до первого и тд. чтобы выполнить проверку на '.'. Блин не судите строго ,но вот моя попытка это вообще не работает.
// in dev 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
#include <iostream> 
#include <cstdio>
using namespace std;
 
int main()
{ 
   
     
    cout << " \n                   Для выхода из программы введите '+'" << " \n ";
    cout << "\n";
    cout << "          Для работы программы введите символ, слово или предложение " << " \n ";
    
    char mas[]={};
     
    while (*mas!= '+') 
     
    {
           gets(mas);
            
    for (;*mas!='\0';(*mas)++ )
    { 
         if ((*mas)='.')
    {
        { cout << "содержится точка -> в " ;break;}
               
        }}
                
        cout << mas << " \n";
        
        }
               
    cout << "ВЫ ввели плюс. Нажмите Enter" << endl;
        
    cin.get();
  
        }
То есть работает, но не так как надо: на замену нулевого элемента строки. Ошибка моя, я так подозреваю, что я обращаюсь к адресу нулевого элемента и провожу так называемую "проверку ", которая при обнаружении и изменяет элемент на '.' из множества символов, но а как обратится к следующему элементу не изменяя элемент я видимо не знаю, подскажите пожалуйста.

 Комментарий модератора 
Используйте теги форматирования кода.
0
Subgrando
03.04.2011, 10:55
  #10

Не по теме:

Цитата Сообщение от Hotbed Посмотреть сообщение
for (int i=0; mas[i]!= '\0'; i++ )
Всегда использовал
C++
1
int len = strlen(str); for(int i = 0; i < len; i++)

0
50 / 4 / 0
Регистрация: 02.04.2011
Сообщений: 60
03.04.2011, 11:17 11
Цитата Сообщение от Subgrando Посмотреть сообщение
Не по теме:
Цитата Сообщение от Hotbed Посмотреть сообщение
for (int i=0; mas[i]!= '\0'; i++ )
От части да, но я для общего развития, захотел узнать как это можно сделать через указатели, указывая на рефлексию своих ошибок. Ведь раздел C/C++ для начинающих.
0
40 / 38 / 5
Регистрация: 22.01.2011
Сообщений: 670
03.04.2011, 13:12 12
C++
1
2
3
4
5
6
7
8
9
    char *mas; mas=new char[20];
    gets(mas);
    for(int n=0; *mas!=0; mas++, n++) //mas++ это указатель от начала списка mas  смещается,
 поэтому в 9-й строке cout<<mas показало бы не всю строку, надо отнять смещение (8-я строка) для вывода всей строки
    {
        if(*mas=='.') {cout<<"to4ka"<<endl; break;}
    }
    mas-=n;
    cout<<mas<<" точка в позиции:"<<n<<endl;
1
49 / 49 / 4
Регистрация: 31.01.2011
Сообщений: 156
03.04.2011, 13:45 13
С помощью указателей или ссылок достигается полиморфизм в C++
0
50 / 4 / 0
Регистрация: 02.04.2011
Сообщений: 60
03.04.2011, 14:12 14
Как я понял из Вашего кода. В Цикле for выполняется переход указателя по всем элементам строки с помощью mas++; и n++ это некий счетчик который перед выводом на терминал, в случае если один из его элементов =='.' , уменьшает mas ровно на смещение n. Но не очень понятно как выведется
C
1
cout<<mas<<" точка в позиции:"<<n<<endl;
Если "n" не в самом цикле. Ведь "n" является локальной областью видимости для цикла for. Или я много себе надумал?<=> Ни че не понимаю.
0
40 / 38 / 5
Регистрация: 22.01.2011
Сообщений: 670
03.04.2011, 14:28 15
вообще да, у меня почему-то в VS 6 работает, а попробовал в VS 2008 нет.
Вынеси тогда переменную n в область видимости функции main
0
50 / 4 / 0
Регистрация: 02.04.2011
Сообщений: 60
03.04.2011, 14:53 16
Но если ''n' будет объявлена(в main()) не в самом цикле for, то она не будет наследовать значение цикла for. Прога работает таким образом
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
#include <iostream> 
#include <cstdio>
using namespace std;
 
int main()
{ 
char n;
char *mas; 
mas=new char[20];
        while (*mas!='+'){
        gets(mas);
        
        for(int n=0; *mas!=0; mas++, n++) 
        {
                if(*mas=='.') {cout<<"to4ka"<<endl; break;}
                }}
        mas=mas-n; 
        cout<< mas <<"точка в элементе"<< n <<endl;
 
 
       
        cin.get();
        
}
Вводим значение с клавы, после for обрабатывает (по средствам while до '+') при обнаружении точки срабатывает break и не срабатывает
C++
1
 cout<< mas <<"точка в элементе"<< n <<endl;
срабатывает лишь поиск точки а именно
C++
1
{cout<<"to4ka"<<endl; break;}
0
40 / 38 / 5
Регистрация: 22.01.2011
Сообщений: 670
03.04.2011, 14:58 17
C++
1
2
3
4
5
6
7
8
9
        char *mas; mas=new char[20];
        int n;
        gets(mas);
        for(n=0; *mas!=0; mas++, n++) 
        {
                if(*mas=='.') {cout<<" точка в позиции:"<<n<<endl; break;}
        }
        mas-=n;
        cout<<mas<<endl;
1
50 / 4 / 0
Регистрация: 02.04.2011
Сообщений: 60
03.04.2011, 15:08 18
Спасибо dimon1984 за помощь все работает
1
14 / 14 / 6
Регистрация: 26.11.2010
Сообщений: 235
03.04.2011, 19:54  [ТС] 19
dimon1984, cпасибо, на вашем примере немного разобрался)
Только вы сказали, что :
for(int n=0; *mas!=0; mas++, n++) //mas++ это указатель от начала списка mas смещается,
поэтому в 9-й строке cout<<mas показало бы не всю строку, надо отнять смещение (8-я строка) для вывода всей строки
А выводит-то всю строку.
И ещё вопрос, по коду, что я выложил:
Цитата Сообщение от Sick2 Посмотреть сообщение
n=n*10+ *p++ - '0' ;
зачем умножать на 10 и отнимать '0'? Никак понять не могу.

Добавлено через 11 минут
Цитата Сообщение от Vladimir. Посмотреть сообщение
Напишите своё бинарное дерево (или реализацию стэка)- многие вопросы отпадут.
Бинарное дерево только прошли, да ещё и не полностью. А стеки писал... и списки писал) Там на мой взгляд как-то попроще)
0
40 / 38 / 5
Регистрация: 22.01.2011
Сообщений: 670
03.04.2011, 21:18 20
C++
1
2
3
4
5
6
7
8
9
        char *mas; mas=new char[20];
        int n;
        gets(mas);
        for(n=0; *mas!=0; mas++, n++) 
        {
                if(*mas=='.') {cout<<" точка в позиции:"<<n<<endl; break;}
        }
        mas-=n;
        cout<<mas<<endl;
если с этой строчкой mas-=n; то конечно будет выводить,
иначе значит при вводе в массив mas не вводилось точек '.'
n=n*10+ *p++ - '0' ;
к примеру возьмём число:1234
переменная n вначале = 0. Если не умножать на 10, то получится число 1+2+3+4=10
А нам надо число 1234. Поэтому сначало берётся число "1", ведь *p ещё указывает на 1 из 1234. *p это разименование указателя, т.е. получение значения по адресу, на который указывает указатель (в данном случае 1). Потом при p++ указатель увеличивается на 1 и указывает уже на 2 из числа 1234. Но это ведь символы(тип Char) а не целочисленное значение int, тоесть число "1" это 49 (смотри ascii) "2" это 50. Поэтому надо отнять "0". А посмотрев в эту же таблицу ascii оказывается "0" это число 48. Поэтому и отнимается число "0" (48). Ведь нам не надо прибавлять в выражении n*10+ *p++ 49 вместо 1.
Такие вот дела

Добавлено через 35 минут
тоесть отнимается "0" (48) от выражения, которое уже в этой части: n*10+ *p
при n=0, вначале р="1" , n*10+ *p значит:
n=0*10+1 //n=1, р++ указывает на "2" из 1234
n=1*10+2 //n=12, р++ указывает на "3" из 1234
n=12*10+3 //n=123, р++ указывает на "4" из 1234
n=123*10+4 //1234
1
03.04.2011, 21:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.04.2011, 21:18
Помогаю со студенческими работами здесь

Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной
Мой код. #include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include&lt;iomanip&gt; using namespace std; ...

Указатели на указатели, как правильно разыменовать, где ошибка?
1)Есть класс: Shape - абстрактный; у него есть классы наследники: Circle, Triangle. 2)Eсть...

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

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


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

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

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