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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
Seatless
1 / 1 / 0
Регистрация: 19.06.2011
Сообщений: 24
#1

Вопрос по выводу символьных массивов - C++

19.06.2011, 15:18. Просмотров 1367. Ответов 8
Метки нет (Все метки)

Никак не могу понять, почему при наличии символьного массива, например char test[] = "test message", при его выводе вроде cout << "test: " << test << endl; или cout << "&test[ 0 ]: " << &test[ 0 ] << endl; (что равнозначно между собой) выводится не адрес первого элемента символьного массива в памяти а сама эта строка (т.е. test message )? Со всеми другими типами массивов все работает как положено.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт С++
4956 / 3032 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
19.06.2011, 15:25     Вопрос по выводу символьных массивов #2
Потому что имя символьного массива трактуется как указатель на первый его элемент, а такой указатель при передаче его в operator<< для std::cout воспринимается как запрос "выведи мне эту строку".

Добавлено через 3 минуты
Чтобы вывести адрес n-го символа, надо сделать так:

C++
1
std::cout << &str + n << std::endl;
grizlik78
Эксперт С++
1903 / 1435 / 109
Регистрация: 29.05.2011
Сообщений: 2,989
19.06.2011, 15:36     Вопрос по выводу символьных массивов #3
Угу, но только если str это именно массив, а не указатель на строку.
универсальный способ, всё-таки, такой:
C++
1
std::cout << reinterpret_cast<void*>(&str[n]) << std::endl;
Seatless
1 / 1 / 0
Регистрация: 19.06.2011
Сообщений: 24
19.06.2011, 15:39  [ТС]     Вопрос по выводу символьных массивов #4
Цитата Сообщение от silent_1991 Посмотреть сообщение
Потому что имя символьного массива трактуется как указатель на первый его элемент, а такой указатель при передаче его в operator<< для std::cout воспринимается как запрос "выведи мне эту строку".

Добавлено через 3 минуты
Чтобы вывести адрес n-го символа, надо сделать так:

C++
1
std::cout << &str + n << std::endl;
Хм, спасибо. Но я все равно не совсем понял почему именно так. Ведь например, если сделать так:
int arr[ 3 ] = { 1, 2, 3 };
int *arrPtr = &arr[ 0 ];
cout << arrPtr << endl;

Это тоже указатель на первый элемент массива типа int, но выводится именно адрес первого элемента в памяти. Или просто тут все дело в особенностях работы операторов ввода\вывода с символьными строками?

И еще сразу вопрос по этой теме:
Почему можно сделать так:
char arr[ 20 ];
cin >> arr;
Но нельзя так:
char *arr;
cin >> arr;
(Вроде как нельзя использовать строку arr без инициализации)
Просто сейчас пытаюсь разобраться со строками и указателями, но непонятны некоторые нюансы.
grizlik78
Эксперт С++
1903 / 1435 / 109
Регистрация: 29.05.2011
Сообщений: 2,989
19.06.2011, 15:43     Вопрос по выводу символьных массивов #5
Цитата Сообщение от Seatless Посмотреть сообщение
Хм, спасибо. Но я все равно не совсем понял почему именно так. Ведь например, если сделать так:
&str имеет тип не char*, а char**, поэтому трактуется уже не как строка, а как адрес. Кстати, поэтому способ silent_1991 не только не универсальный, но и работать правильно может только при n == 0.
silent_1991
Эксперт С++
4956 / 3032 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
19.06.2011, 15:44     Вопрос по выводу символьных массивов #6
1. Потому что всё зависит от типа указателя. Вывод указателя на int заставляет вывести адрес, а вот вывод указателя на char - именно строку.
2. Потому что arr[20] - массив, под который выделена память (занимает в памяти 20 * sizeof(char) байт и имеет определённый адрес), а *arr - просто указатель, который указывает на случайную область памяти (содержит мусор). Мы не можем просто взять и записать строку в случайную область памяти, потому как в ней могут находиться критические для работы программы данные.
diagon
Higher
1924 / 1190 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
19.06.2011, 15:45     Вопрос по выводу символьных массивов #7
Цитата Сообщение от Seatless Посмотреть сообщение
И еще сразу вопрос по этой теме:
Почему можно сделать так:
char arr[ 20 ];
cin >> arr;
Но нельзя так:
char *arr;
cin >> arr;
(Вроде как нельзя использовать строку arr без инициализации)
Просто сейчас пытаюсь разобраться со строками и указателями, но непонятны некоторые нюансы.
Использовать строку без инициализации можно, но нужно выделить под нее память.
В первом случае она выделяется статически, во втором просто объявляется указатель без выделения памяти.
...
fail
silent_1991
Эксперт С++
4956 / 3032 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
19.06.2011, 15:46     Вопрос по выводу символьных массивов #8
grizlik78, ах ты чёрт, действительно, ошибочка вышла...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.06.2011, 15:46     Вопрос по выводу символьных массивов
Еще ссылки по теме:

функция по выводу звезд на экран нн работает, в чем дело? C++
Сравнение символьных буфферов (массивов) C++
C++ Вывод двух символьных массивов, завершающий символ
Программа по выводу самого большого введеного слова C++
C++ Написать программу по выводу всех совершенных чисел до заданного

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

Или воспользуйтесь поиском по форуму:
silentnuke
Android Programmer
138 / 139 / 5
Регистрация: 08.12.2010
Сообщений: 421
19.06.2011, 15:46     Вопрос по выводу символьных массивов #9
Цитата Сообщение от Seatless Посмотреть сообщение
Почему можно сделать так:
char arr[ 20 ];
cin >> arr;
Но нельзя так:
char *arr;
cin >> arr;
(Вроде как нельзя использовать строку arr без инициализации)
Просто сейчас пытаюсь разобраться со строками и указателями, но непонятны некоторые нюансы.
в первом случае статический массив, во втором указатель типа char. чтобы можно было сделать cin>>arr; вначале нужно выделить память: arr=new char[20];
Yandex
Объявления
19.06.2011, 15:46     Вопрос по выводу символьных массивов
Ответ Создать тему
Опции темы

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