Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
#1

Указатели - C++

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

Здравствуйте. Прошу ответить на мои вопросы:
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2011, 20:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатели (C++):

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

Через указатели на указатели посчитать сумму двух чисел и записать в третье - C++
1. Через указатели на указатели посчитать сумму двух чисел и записать в третье. 2. Написать примитивный калькулятор, пользуясь только...

Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной - C++
Мой код. #include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include&lt;iomanip&gt; using namespace std; void min_max(int*pa, int*pb,...

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

Отсортировать массив и вывести на экран (массивы и указатели на указатели) - C++
Даны массивы F-фамилий студентов и S-результаты сессии (5 оценок) , причем s- результат сессии F студента. Отсортировать массив S по...

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

20
Hotbed
48 / 2 / 1
Регистрация: 02.04.2011
Сообщений: 56
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
dimon1984
40 / 38 / 0
Регистрация: 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
Hotbed
48 / 2 / 1
Регистрация: 02.04.2011
Сообщений: 56
03.04.2011, 15:08 #18
Спасибо dimon1984 за помощь все работает
1
Sick2
14 / 14 / 1
Регистрация: 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
dimon1984
40 / 38 / 0
Регистрация: 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
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
04.04.2011, 00:34  [ТС] #21
С обычными указателями чуть разобрался...но вот массивы указателей, указатели на фунцию...
0
04.04.2011, 00:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2011, 00:34
Привет! Вот еще темы с ответами:

Написать программу сортировки через указатели на указатели - C++
Вот моя программа #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;string&gt; using namespace std; //Сортировка &quot;пузырьком&quot;. ...

Используются ли на практике указатели на указатели объектов? - C++
Имеются ввиду указатели именно на объекты, а не динамические массивы. Например такой: Object** obj; А как насчёт такого: Object***...

Указатели на массивы. Указатели и функции - C++
Вот задача: Даны два массива : А и B. Необходимо создать третий массив, в котором нужно собрать: -Элементы обоих массивов; -Общие...

Константные указатели и указатели на константу - C++
Чем они, собственно говоря, отличаются? Поясните, пожалуйста. Не знаю, как так получилось, что в разных источниках - разные...


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

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

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