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

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

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

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

02.04.2011, 20:08. Просмотров 1311. Ответов 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;); Может, что то я делаю не...

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

передав этот номер какой то функции она может менять то что лежит в ящике,
а передав то что лежит в ящике она сможет этим пользоваться, но изменить это именно там откуда это пришло она не сможет, так как не знает адреса
Subgrando
40 / 40 / 3
Регистрация: 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 - мусор).
vitaska
84 / 84 / 2
Регистрация: 04.02.2010
Сообщений: 162
02.04.2011, 23:33     Указатели #6
Еще указатели нужны для работы с динамической памятью.
^Tecktonik_KiLLeR
1159 / 441 / 22
Регистрация: 23.06.2009
Сообщений: 6,234
Завершенные тесты: 1
03.04.2011, 00:00     Указатели #7
сам не про, но вижу две причины.
1.передать ссылку на фото будет легче, чем передать само фото с размером 20мб.
Думаю пример поняли.
2.Скажем есть функция, которая находит максимальный элемент из списка,а так же его местоположение. Как знаем, функция возвращает один параметр(с помощью return), но с помощью указателей можно возвращать хотя сто.
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
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)Это вопрос уже к про). Даже не знаю, как его сформулировать. Когда вы поняли, что поняли указатели, и знаете, как и, где их использовать? Сколько по времени заняло это?
увы не про. Неделю или две на минимальном уровне после связных списков.

Вы писали что проходите структуры данных. Напишите своё бинарное дерево (или реализацию стэка)- многие вопросы отпадут.
зы: написать - иметь компилируемый код, верно работающий с хотя бы с тестовыми примерами.
Hotbed
48 / 2 / 1
Регистрация: 02.04.2011
Сообщений: 56
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();
  
        }
То есть работает, но не так как надо: на замену нулевого элемента строки. Ошибка моя, я так подозреваю, что я обращаюсь к адресу нулевого элемента и провожу так называемую "проверку ", которая при обнаружении и изменяет элемент на '.' из множества символов, но а как обратится к следующему элементу не изменяя элемент я видимо не знаю, подскажите пожалуйста.

 Комментарий модератора 
Используйте теги форматирования кода.
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++)

Hotbed
48 / 2 / 1
Регистрация: 02.04.2011
Сообщений: 56
03.04.2011, 11:17     Указатели #11
Цитата Сообщение от Subgrando Посмотреть сообщение
Не по теме:
Цитата Сообщение от Hotbed Посмотреть сообщение
for (int i=0; mas[i]!= '\0'; i++ )
От части да, но я для общего развития, захотел узнать как это можно сделать через указатели, указывая на рефлексию своих ошибок. Ведь раздел C/C++ для начинающих.
dimon1984
40 / 38 / 0
Регистрация: 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;
Dejust
49 / 49 / 1
Регистрация: 31.01.2011
Сообщений: 156
03.04.2011, 13:45     Указатели #13
С помощью указателей или ссылок достигается полиморфизм в C++
Hotbed
48 / 2 / 1
Регистрация: 02.04.2011
Сообщений: 56
03.04.2011, 14:12     Указатели #14
Как я понял из Вашего кода. В Цикле for выполняется переход указателя по всем элементам строки с помощью mas++; и n++ это некий счетчик который перед выводом на терминал, в случае если один из его элементов =='.' , уменьшает mas ровно на смещение n. Но не очень понятно как выведется
C
1
cout<<mas<<" точка в позиции:"<<n<<endl;
Если "n" не в самом цикле. Ведь "n" является локальной областью видимости для цикла for. Или я много себе надумал?<=> Ни че не понимаю.
dimon1984
40 / 38 / 0
Регистрация: 22.01.2011
Сообщений: 670
03.04.2011, 14:28     Указатели #15
вообще да, у меня почему-то в VS 6 работает, а попробовал в VS 2008 нет.
Вынеси тогда переменную n в область видимости функции main
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. Посмотреть сообщение
Напишите своё бинарное дерево (или реализацию стэка)- многие вопросы отпадут.
Бинарное дерево только прошли, да ещё и не полностью. А стеки писал... и списки писал) Там на мой взгляд как-то попроще)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.04.2011, 21:18     Указатели
Еще ссылки по теме:

Указатели!! - 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; ...


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

Или воспользуйтесь поиском по форуму:
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
Yandex
Объявления
03.04.2011, 21:18     Указатели
Ответ Создать тему
Опции темы

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