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

не совсем понимаю код *указатели - C++

Восстановить пароль Регистрация
 
electromind
0 / 0 / 0
Регистрация: 11.06.2009
Сообщений: 55
17.03.2012, 00:05     не совсем понимаю код *указатели #1
изучаю указатели, столкнулся с кодом не совсем могу понять что происходит в функции *g_s,
особенно это условие
C++
1
*p2 && *p2 == *p
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
#include <iostream>
#include <locale>
 
using namespace std;
 
char *g_s(char *sub, char *str);
 
int main ()
{
    setlocale(LC_ALL,"");
    char *substr;
 
    substr = g_s("tri", "odin dva tri 4etire");
 
    cout << "podstroka: " << substr;
        
    return 0;
}
 
char *g_s(char *sub, char *str)
{
    int t;
    char *p, *p2, *start;
 
    for(t=0; str[t]; t++)
    {
        p = &str[t];
        start = p;
        p2 = sub;
        while(*p2 && *p2 == *p)
        {
            p++;
            p2++;
        }
        if (!*p2)
            return start;
    }
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
17.03.2012, 00:12     не совсем понимаю код *указатели #2
вот это условие

Цитата Сообщение от electromind Посмотреть сообщение
*p2 && *p2 == *p
равносильно этому

C++
1
*p2 != NULL && *p2 == *p // так наглядней
electromind
0 / 0 / 0
Регистрация: 11.06.2009
Сообщений: 55
17.03.2012, 00:55  [ТС]     не совсем понимаю код *указатели #3
C++
1
2
3
4
5
while(*p2 && *p2 == *p)
                {
                        p++;
                        p2++;
                }
вот совсем не понимаю этот цикл... т.е. что он делает
разъясните если не трудно...
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6156 / 2885 / 281
Регистрация: 04.12.2011
Сообщений: 7,680
Записей в блоге: 3
17.03.2012, 02:25     не совсем понимаю код *указатели #4
Цитата Сообщение от electromind Посмотреть сообщение
C++
1
2
while(*p2 && *p2 == *p)
{ p++; p2++; }
Задача не кажется сложной даже для человека в чистом С++ не разбирающегося (меня), по-этому попробую.
p2 и p объявлены указателями на char. Операция * - операция разадресации дающая содержимое памяти (значение) на которое указывает указатель, т.е. в нашем случае - char. Стало быть в логическом блоке оператора цикла while первый символ *p будет неявно преобразован к bool, то есть в случае если операция разадресации пройдет с результатом - нулевой указатель - false, об этом сказал Infinity3000, иначе если арифметический эквивалент (char внутренне - целый тип и легко преобразуется в выражениях где ожидается целое в целое) символа - ноль тоже false, и во всех остальных случаях - true. Другими словами в сочетании с p2++; в теле цикла первое условие перемещает указатель по непрерывной области памяти, пока p2 указывает на char "не равный нулю".
Второе условие сравнивает символы *p2 и *p и пока они совпадают разрешает перемещение указателей p2 и p. Цикл прекратится если p2 указывает не на char или на char преобразуемый к 0, или символы по адресам p2 и p разные (до первого расхождения). Из области фантазий: можно предположить, что строки p2 и p1 могут отличаться (а могут и нет) и ищется позиция символа - где есть первое расхождение. Но могут конечно быть и другие варианты.
Yandex
Объявления
17.03.2012, 02:25     не совсем понимаю код *указатели
Ответ Создать тему
Опции темы

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