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

Непонятный момент в программе с указателями - C++

Восстановить пароль Регистрация
 
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
07.12.2011, 21:55     Непонятный момент в программе с указателями #1
Для вывода строки по элементам была написана программа, в которой применялся указатель

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
void f (char v[])
{
    for (char* p = v; *p!=0; p++)
    {
        std::cout << *p;
    }
    std::cout << "\n";
}
 
int main ()
{
    char str[] = "Grace missed him so badly that she almost pined away to nothing.";
    f (str);
    
    return 0;
}
но в функции была сделана ошибка, и вместо строки
C++
1
std::cout << *p;
оказалось написано
C++
1
std::cout << p;
а программа целиком соотвественно выглядела таким образом
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
void f (char v[])
{
    for (char* p = v; *p!=0; p++)
    {
        std::cout << p;
    }
    std::cout << "\n";
}
 
int main ()
{
    char str[] = "Grace missed him so badly that she almost pined away to nothing.";
    f (str);
    
    return 0;
}
Из того, что я знаю об указателях, я бы предположила, что она должна выводить адреса всех символов массива, но вместо этого она выводит строку текста в цикле, в каждой итерации отрубая по одной букве сначала:

Grace missed him so badly that she almost pined away to nothing.race missed him
so badly that she almost pined away to nothing.ace missed him so badly that she
almost pined away to nothing.ce missed him so badly that she almost pined away t
o nothing.e missed him so badly that she almost pined away to nothing. missed hi
m so badly that she almost pined away to nothing.missed him so badly that she al
most pined away to nothing.issed him so badly that she almost pined away to noth
ing.ssed him so badly that she almost pined away to nothing.sed him so badly tha
t she almost pined away to nothing.ed him so badly that she almost pined away to
nothing.d him so badly that she almost pined away to nothing. him so badly that
she almost pined away to nothing.him so badly that she almost pined away to not
hing.im so badly that she almost pined away to nothing.m so badly that she almos
t pined away to nothing. so badly that she almost pined away to nothing.so badly
that she almost pined away to nothing.o badly that she almost pined away to not
hing. badly that she almost pined away to nothing.badly that she almost pined aw
ay to nothing.adly that she almost pined away to nothing.dly that she almost pin
ed away to nothing.ly that she almost pined away to nothing.y that she almost pi
ned away to nothing. that she almost pined away to nothing.that she almost pined
away to nothing.hat she almost pined away to nothing.at she almost pined away t
o nothing.t she almost pined away to nothing. she almost pined away to nothing.s
he almost pined away to nothing.he almost pined away to nothing.e almost pined a
way to nothing. almost pined away to nothing.almost pined away to nothing.lmost
pined away to nothing.most pined away to nothing.ost pined away to nothing.st pi
ned away to nothing.t pined away to nothing. pined away to nothing.pined away to
nothing.ined away to nothing.ned away to nothing.ed away to nothing.d away to n
othing. away to nothing.away to nothing.way to nothing.ay to nothing.y to nothin
g. to nothing.to nothing.o nothing. nothing.nothing.othing.thing.hing.ing.ng.g..

Объясните, пожалуйста, почему так происходит, не могу понять?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.12.2011, 21:55     Непонятный момент в программе с указателями
Посмотрите здесь:

C++ Непонятный вывод
Непонятный typedef C++
C++ Непонятный синтаксис
Непонятный код? C++
C++ Не удается в главной программе уладить противоречия с указателями и адресами
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
07.12.2011, 22:00     Непонятный момент в программе с указателями #2
C++
1
std::cout << const char*;
- это вывод строки. оператор << для типа const char* так реализован. он выводит байты в виде символов до тех пор, пока не втретит нулевой байт (конец стоки маркируется нулевым байтом)

C++
1
std::cout << char;
- просто вывод символа.

хотите видеть адрес каждого символа - преобразуйте его явно из const char* в const void*;
т.е. так
C++
1
std::cout << static_cast<const void*>(p);
- выведется адрес.
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
07.12.2011, 22:20  [ТС]     Непонятный момент в программе с указателями #3
DU, не совсем, конечно, ясно, но всё же яснее чем было.
адреса символов мне нужны не были, было непонятно, почему так происходит.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
07.12.2011, 22:24     Непонятный момент в программе с указателями #4
C++
1
2
3
4
for (char* p = v; *p!=0; p++)
 {
    std::cout << p;
  }
в цикле на каждой итерации выводится строка, на которую указывает p. на первой итерации p указывает на всю строку. она и выводится. на второй итерации p снова указывает на строку, но она начинается со второго символа вашей исходной строки. выводится как бы урезанная на один символ строка. ну и так далее, пока p не начнет указывать строку, которая начинается нулевым символом, т.е. на пустую строку. на этом цикл завершается.
Bers
Заблокирован
07.12.2011, 22:25     Непонятный момент в программе с указателями #5
C++
1
2
3
4
5
6
7
8
int main()
{
    char* p="123"; 
    std::cout<<p<<std::endl; //вот так выводим саму строчку
    std::cout<< &p<<std::endl; //а вот так - адрес, который 
                                             //указывает на первую буковку строчки
 
}
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
07.12.2011, 22:28     Непонятный момент в программе с указателями #6
C++
1
2
3
4
5
6
7
8
int main()
{
    char* p="123"; 
    std::cout<<p<<std::endl; //вот так выводим саму строчку
    std::cout<< &p<<std::endl; //а вот так - адрес, который 
                                             //указывает на первую буковку строчки
 
}
неверно. это адрес, по которому рассполагается переменная p, которая имеет тип char*. выражение &p имеет тип char**. т.е. не адрес первого символа.
Bers
Заблокирован
07.12.2011, 22:34     Непонятный момент в программе с указателями #7
Цитата Сообщение от Heidel Посмотреть сообщение
было непонятно, почему так происходит.
Это происходит потому, что вы скармливали cout сам указатель на char, а не адрес этого указателя.

cout - волшебный объект. Он так устроен, что если ему скормить указатель на char, то он думает, что пользователь хочет увидеть строку на которую смотрит этот указатель, а не его адрес

Добавлено через 5 минут
Цитата Сообщение от DU Посмотреть сообщение
т.е. не адрес первого символа.
Ну если надо адрес самой буковки, а не указателя:

C++
1
std::cout<< (int*)(p)<<std::endl; //вот так выводим адрес первой буковки
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
07.12.2011, 22:38  [ТС]     Непонятный момент в программе с указателями #8
Bers, да, у меня кстати были мысли, что cout указатель на именно char таким образом воспринимает.
а если cout скормить указатель на, допустим, int, выведет ведь адрес?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2011, 22:41     Непонятный момент в программе с указателями
Еще ссылки по теме:

Подскажите один момент в программе C++
C++. Непонятный символ C++
Непонятный цикл C++

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

Или воспользуйтесь поиском по форуму:
Bers
Заблокирован
07.12.2011, 22:41     Непонятный момент в программе с указателями #9
Цитата Сообщение от Heidel Посмотреть сообщение
а если cout скормить указатель на, допустим, int, выведет ведь адрес?
7й пост
Yandex
Объявления
07.12.2011, 22:41     Непонятный момент в программе с указателями
Ответ Создать тему
Опции темы

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