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

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

Войти
Регистрация
Восстановить пароль
 
Heidel
111 / 111 / 7
Регистрация: 11.10.2011
Сообщений: 647
#1

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

07.12.2011, 21:55. Просмотров 252. Ответов 8
Метки нет (Все метки)

Для вывода строки по элементам была написана программа, в которой применялся указатель

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..

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

Непонятный момент с комплексными матрицами - C++
Вот задание: Комплексная матрица Z представляется парой X, Y действительных матриц так, что Z=X+iY. Даны действительные квадратные...

Не удается в главной программе уладить противоречия с указателями и адресами - C++
Доброго времени суток,у меня есть почти готовая программа, но у меня проблемы с указателями и адресами. Все ф-ии вроде написаны правильно,...

Подскажите один момент в программе - C++
Код не мой, по этому не могу понять одну деталь,программа-калькулятор #define _CRT_SECURE_NO_WARNINGS #include &lt;stdio.h&gt; #include...

Работа с указателями - C++
#include &lt;iostream&gt; #include &lt;cstdio&gt; #include &lt;iomanip&gt; using namespace std; int main() { int i;float f;long int l;double d;...

работа с указателями - C++
небольшая проблемка, никак не могу разобраться с указателями. Я так понял что создавая массив лучше если сразу сдалешь на него указатель и...

Работа с указателями - C++
Подскажите пожалуйста, зачем написано * Rad_to_deg void show_polar (const polar * pda) { using namespace std; const...

8
DU
1483 / 1129 / 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);
- выведется адрес.
0
Heidel
111 / 111 / 7
Регистрация: 11.10.2011
Сообщений: 647
07.12.2011, 22:20  [ТС] #3
DU, не совсем, конечно, ясно, но всё же яснее чем было.
адреса символов мне нужны не были, было непонятно, почему так происходит.
0
DU
1483 / 1129 / 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 не начнет указывать строку, которая начинается нулевым символом, т.е. на пустую строку. на этом цикл завершается.
0
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; //а вот так - адрес, который 
                                             //указывает на первую буковку строчки
 
}
0
DU
1483 / 1129 / 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**. т.е. не адрес первого символа.
1
Bers
Заблокирован
07.12.2011, 22:34 #7
Цитата Сообщение от Heidel Посмотреть сообщение
было непонятно, почему так происходит.
Это происходит потому, что вы скармливали cout сам указатель на char, а не адрес этого указателя.

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

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

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

Хитрости с указателями - C++
Всем ку. Требуется небольшой хелп. Сама задача проста. суть ее такова: Нужно вывести двоичное представление числа с плавающей точкой....

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

Ошибка с указателями - C++
Рад снова всех приветствовать. У меня появилась небольшая проблема. Изучаю C++ по книге Р. Лафоре &quot;ООП в C++&quot;. Так вот, в принципе, книга...

Прикол с указателями - C++
взял пример с http://www.cplusplus.com/reference/algorithm/find/, немного поэксперементировал и наткнулся на необъяснимый факт) Смотрим: ...


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

Или воспользуйтесь поиском по форуму:
9
Yandex
Объявления
07.12.2011, 22:41
Ответ Создать тему
Опции темы

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