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

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

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

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

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

Про указатель *, указатель на указатель **, и про new - C++
#include &quot;stdafx.h&quot; class neuro { public: double *inputs; int inputs_count; neuro(int uc, double ii ) { ...

Про указатель на функцию - C++
Народ, у меня есть стандартная функция (создание потоков), она требует чтобы ей 3-м параметром передали указатель на функцию (void*...

Указатель и снова про русский язык в консоли - C++
Здравствуйте.Указатель не возвращает русские буквы. Пишу что то на русском, возвращает набор символов, на анг все норм. Как можно...

Как получить ссылку на указатель или указатель на указатель в массиве? - C++
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если...

Функция, получающая указатель на обычную функцию, получает указатель на метод класса - C++
Здравтсвуйте. Имеется вопрос по указателям на методы класса. Допустим, есть функция( f ), которая принимает указатель на функцию и...

Функция, принимающая указатель и число байт и выделяющая память под указатель - C++
Здравствуйте. Задача легкая, но почему-то завис Нужно написать функцию, принимающую указатель и число байт и выделяющую память под...

9
Schizorb
510 / 462 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
30.10.2012, 18:31 #2
Потому что это не одно и то же.

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

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

C++
1
if(*s != 0)
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 или конец строки?
0
Schizorb
510 / 462 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
30.10.2012, 18:45 #6
Одно и то же, символ '\0' имеет целочисленное значение 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;
 }
0
Schizorb
510 / 462 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
30.10.2012, 19:02 #8
C++
1
if (*s) // если указатель стоит на конце строки, то делать рекурсию, но ведь он не на конце строки.
Наоборот, условие истинно, если он НЕ стоит в конце строки, т.е. если *s != '\0'.
1
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;
}
0
Schizorb
510 / 462 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
30.10.2012, 20:14 #10
Этот код вообще не компилируется. Функция reverse должна принимать 2 параметра? Почему в прототипе он один? И в рекурсивном вызове тоже один: reverse(s-1).
0
30.10.2012, 20:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2012, 20:14
Привет! Вот еще темы с ответами:

Как правильно удалять выделенную память под указатель на указатель? - C++
есть код #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; using namespace std; void sort_1(const...

Реализация двоичных деревьев поиска: Зачем в параметрах функции используется указатель на указатель - C++
Всем привет, встретил в книге такой пример добавления узла в дерево: typedef struct tree { int data; tree *left, *right,...

Указатель на указатель, функции для создания новых массивов? - C++
Всем привет! У меня в коде есть несколько новых массивов, чтобы не повторяться я создам функцию которая будет выделять память под новые...

Передача умного указателя в функцию принимающую указатель на указатель - C++
Итак имеется функция со следующим параметром: HRESULT __stdcall Function(SomeClass **param); В случае, когда создаём обычный...


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

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

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