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

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

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

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

C++
1
std::cout << &str + n << std::endl;
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
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
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
19.06.2011, 15:43     Вопрос по выводу символьных массивов #5
Цитата Сообщение от Seatless Посмотреть сообщение
Хм, спасибо. Но я все равно не совсем понял почему именно так. Ведь например, если сделать так:
&str имеет тип не char*, а char**, поэтому трактуется уже не как строка, а как адрес. Кстати, поэтому способ silent_1991 не только не универсальный, но и работать правильно может только при n == 0.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
19.06.2011, 15:44     Вопрос по выводу символьных массивов #6
1. Потому что всё зависит от типа указателя. Вывод указателя на int заставляет вывести адрес, а вот вывод указателя на char - именно строку.
2. Потому что arr[20] - массив, под который выделена память (занимает в памяти 20 * sizeof(char) байт и имеет определённый адрес), а *arr - просто указатель, который указывает на случайную область памяти (содержит мусор). Мы не можем просто взять и записать строку в случайную область памяти, потому как в ней могут находиться критические для работы программы данные.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 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
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 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++ Вывод двух символьных массивов, завершающий символ

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

Или воспользуйтесь поиском по форуму:
silentnuke
Android Programmer
137 / 138 / 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     Вопрос по выводу символьных массивов
Ответ Создать тему
Опции темы

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