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

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

Войти
Регистрация
Восстановить пароль
 
aleksand
21 / 9 / 2
Регистрация: 18.06.2011
Сообщений: 185
#1

Про указатель - C++

30.10.2012, 18:27. Просмотров 251. Ответов 9
Метки нет (Все метки)

Почему не работает когда я пишу вот так вот: if(*s) printf("тут"); и работает когда пишу вот так вот: if(*s=='\0') printf("тут");? Ведь это одно и тоже!

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 <windows.h>
#include <string.h>
#include <stdio.h>
using namespace std;
 
void reverse(char *s);
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    char *s, *q;
    char str[] = "Это";
    s = str;
    q = str;
    while(*s)
    {
       printf("%s\n", s);
       s++;
    }
    printf("%s\n", s);
    reverse(s);
    return 0;
}
 
void reverse(char *s)
{
    if(*s) printf("тут");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.10.2012, 18:27     Про указатель
Посмотрите здесь:

C++ Про указатель на функцию
Про указатель *, указатель на указатель **, и про new C++
указатель C++
C++ указатель
Указатель на указатель C++
C++ Указатель
указатель C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
30.10.2012, 18:31     Про указатель #2
Потому что это не одно и то же.

Надо if(!*s)
aleksand
21 / 9 / 2
Регистрация: 18.06.2011
Сообщений: 185
30.10.2012, 18:35  [ТС]     Про указатель #3
Цитата Сообщение от Schizorb Посмотреть сообщение
Потому что это не одно и то же.

Надо if(!*s)
Тогда что означает записать if(*s) printf("тут"); ?
Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
30.10.2012, 18:37     Про указатель #4
C++
1
if(*s)
аналогично

C++
1
if(*s != 0)
aleksand
21 / 9 / 2
Регистрация: 18.06.2011
Сообщений: 185
30.10.2012, 18:42  [ТС]     Про указатель #5
Цитата Сообщение от Schizorb Посмотреть сообщение
C++
1
if(*s)
аналогично

C++
1
if(*s != 0)
Под этим if(*s != 0) имеется ввиду 0 или конец строки?
Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
30.10.2012, 18:45     Про указатель #6
Одно и то же, символ '\0' имеет целочисленное значение 0.
aleksand
21 / 9 / 2
Регистрация: 18.06.2011
Сообщений: 185
30.10.2012, 18:51  [ТС]     Про указатель #7
Цитата Сообщение от Schizorb Посмотреть сообщение
Одно и то же, символ '\0' имеет целочисленное значение 0.
Если это одно и тоеж, тогда почему работает этот код: (вопрос в комментарии к коду)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
 
void reverse (char *s);
 int main()
{
  char str [] = "eto test";
  reverse (str);
      return 0;
}
 
// вывод строки в обратном порядке
void reverse (char *s)
 
{if (*s) // если указатель стоит на конце строки, то делать рекурсию, но ведь он не на конце строки. Запутали меня вообще. Давайте помогайте распутывать.
reverse (s+1);
else
return;
 
cout << *s;
 }
Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
30.10.2012, 19:02     Про указатель #8
C++
1
if (*s) // если указатель стоит на конце строки, то делать рекурсию, но ведь он не на конце строки.
Наоборот, условие истинно, если он НЕ стоит в конце строки, т.е. если *s != '\0'.
aleksand
21 / 9 / 2
Регистрация: 18.06.2011
Сообщений: 185
30.10.2012, 19:20  [ТС]     Про указатель #9
Разобрался, спасибо.

Добавлено через 13 минут
Цитата Сообщение от Schizorb Посмотреть сообщение
C++
1
if (*s) // если указатель стоит на конце строки, то делать рекурсию, но ведь он не на конце строки.
Наоборот, условие истинно, если он НЕ стоит в конце строки, т.е. если *s != '\0'.
Ещё подскажите пожалуйста, все вопросы в комментарии.

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
#include <iostream>
#include <windows.h>
#include <string.h>
#include <stdio.h>
using namespace std;
 
void reverse(char *s);
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    char *s, *q;
    char str[] = "Это";
    s = str;
    q = str;
    while(*s)
    {
       printf("%s\n", s);
       s++;
    }
    printf("%s\n", q);
    reverse(s, q); // передаю два указателя: 1). s указывает на конец строки. 2). q указывает на начало строки
    return 0;
}
 
void reverse(char *s, char *q) 
{
    printf("%s\n", s);
    if(*s!=*q) reverse(s-1); // тут у нас если значение указателя s не равно значению указателя q, то у нас будет делаться рекурсия и в определённый момент q==s и тогда у нас будет return. Почему собственно код не работает? Вроде всё правильно.
    else return;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2012, 20:14     Про указатель
Еще ссылки по теме:

C++ Указатель
Указатель this C++
C++ Указатель this
C++ Указатель на указатель
C++ Указатель и снова про русский язык в консоли

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

Или воспользуйтесь поиском по форуму:
Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
30.10.2012, 20:14     Про указатель #10
Этот код вообще не компилируется. Функция reverse должна принимать 2 параметра? Почему в прототипе он один? И в рекурсивном вызове тоже один: reverse(s-1).
Yandex
Объявления
30.10.2012, 20:14     Про указатель
Ответ Создать тему
Опции темы

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