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

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

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

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

02.04.2011, 20:08. Просмотров 1312. Ответов 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.
Прошу помощи, указатели - больная тема =(
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2011, 20:08     Указатели
Посмотрите здесь:

Указатели - C++
Помогите. Код рабочей программы через простое обращение к массиву. нужно чтоб обращение было через адресацию с использованием (&amp; *)...

Указатели - C++
Нужно очень срочно. 1. Дано целое n&gt;2. Напечатать все простые числа из диапазона ; 2. Заданы 3 натуральных числа а,b,c которые...

Указатели - C++
Помогите плиз! Введите с клавиатуры данные в массив целого типа, а затем перепишите их значения в другой массив удвоенной размерности...

Указатели - C++
Наткнулся на вот такой цикл for (char p=str; *p!=(char)0; ++p) ,поясните пожалуйста что значит *p!=(char)0

Указатели - C++
1.Заданы три натуральных числа А, В, С, которые обозначают число, месяц и год. Найти порядковый номер даты, начиная отсчет с начала года. ...

Указатели в С++ - C++
Здравствуйте...требуется помощь по следующей задаче... Задача: Создать функцию, которая возвращает количество элементов массива меньше...

Указатели - C++
int k=5; int *ukaz; ukaz=&amp;k; *ukaz=17; printf(&quot;%o\n&quot;,ukaz); printf(&quot;%o\n&quot;,k); system(&quot;pause&quot;); Может, что то я делаю не...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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;}
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;
Hotbed
48 / 2 / 1
Регистрация: 02.04.2011
Сообщений: 56
03.04.2011, 15:08     Указатели #18
Спасибо dimon1984 за помощь все работает
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. Посмотреть сообщение
Напишите своё бинарное дерево (или реализацию стэка)- многие вопросы отпадут.
Бинарное дерево только прошли, да ещё и не полностью. А стеки писал... и списки писал) Там на мой взгляд как-то попроще)
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2011, 00:34     Указатели
Еще ссылки по теме:

Указатели!! - C++
Пользователь вводит строку с клавиатуры - предложение с пробелами и знаками пунктуации длиной до 100 символов. Вывести на экран все знаки...

Указатели С - C++
Объясните пожалуйста как получается что запись типа *(1+data) эквивалентна записи 1. Как из data получается *(1+data) и *(data+1)...

указатели - C++
Вот собственно код, проблема в том что я непойму как он работает, что именно непонятно указал в комментариях unsigned char **...

Указатели - C++
например мы имеем данный кусок кода char str=&quot;eto prostoi test&quot;; char *start; start=str; cout&lt;&lt;start; *start='b'; ...

указатели - C++
Здравствуйте! Ребят , вы не могли бы объяснить некоторые нюансы ,связанные с указателями, недалекому человеку? допустим: int N; ...


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

Или воспользуйтесь поиском по форуму:
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
04.04.2011, 00:34  [ТС]     Указатели #21
С обычными указателями чуть разобрался...но вот массивы указателей, указатели на фунцию...
Yandex
Объявления
04.04.2011, 00:34     Указатели
Ответ Создать тему
Опции темы

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