Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
Seatless
1 / 1 / 3
Регистрация: 19.06.2011
Сообщений: 24
#1

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

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

Никак не могу понять, почему при наличии символьного массива, например char test[] = "test message", при его выводе вроде cout << "test: " << test << endl; или cout << "&test[ 0 ]: " << &test[ 0 ] << endl; (что равнозначно между собой) выводится не адрес первого элемента символьного массива в памяти а сама эта строка (т.е. test message )? Со всеми другими типами массивов все работает как положено.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.06.2011, 15:18
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Вопрос по выводу символьных массивов (C++):

Копирование символьных массивов
Вот самые проблемные места: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

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

Поразрядная сортировка символьных массивов
Всем привет! Кто нибудь может показать пример кода, для поразрядной сортировки...

Сравнение символьных буфферов (массивов)
Добрый всем день. Заранее прошу прощения, если такая тема уже существует или...

Сравнение двух символьных массивов - char C++
Доброго времени суток! Столкнулся с проблемой кода программы. Мне нужно...

Вывод двух символьных массивов, завершающий символ
Товарищи! Помогите разобраться.... Вот простейшая программа: int main() {...

8
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
19.06.2011, 15:25 #2
Потому что имя символьного массива трактуется как указатель на первый его элемент, а такой указатель при передаче его в operator<< для std::cout воспринимается как запрос "выведи мне эту строку".

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

C++
1
std::cout << &str + n << std::endl;
2
grizlik78
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,048
19.06.2011, 15:36 #3
Угу, но только если str это именно массив, а не указатель на строку.
универсальный способ, всё-таки, такой:
C++
1
std::cout << reinterpret_cast<void*>(&str[n]) << std::endl;
1
Seatless
1 / 1 / 3
Регистрация: 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 без инициализации)
Просто сейчас пытаюсь разобраться со строками и указателями, но непонятны некоторые нюансы.
0
grizlik78
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,048
19.06.2011, 15:43 #5
Цитата Сообщение от Seatless Посмотреть сообщение
Хм, спасибо. Но я все равно не совсем понял почему именно так. Ведь например, если сделать так:
&str имеет тип не char*, а char**, поэтому трактуется уже не как строка, а как адрес. Кстати, поэтому способ silent_1991 не только не универсальный, но и работать правильно может только при n == 0.
1
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
19.06.2011, 15:44 #6
1. Потому что всё зависит от типа указателя. Вывод указателя на int заставляет вывести адрес, а вот вывод указателя на char - именно строку.
2. Потому что arr[20] - массив, под который выделена память (занимает в памяти 20 * sizeof(char) байт и имеет определённый адрес), а *arr - просто указатель, который указывает на случайную область памяти (содержит мусор). Мы не можем просто взять и записать строку в случайную область памяти, потому как в ней могут находиться критические для работы программы данные.
1
diagon
Higher
1937 / 1203 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
19.06.2011, 15:45 #7
Цитата Сообщение от Seatless Посмотреть сообщение
И еще сразу вопрос по этой теме:
Почему можно сделать так:
char arr[ 20 ];
cin >> arr;
Но нельзя так:
char *arr;
cin >> arr;
(Вроде как нельзя использовать строку arr без инициализации)
Просто сейчас пытаюсь разобраться со строками и указателями, но непонятны некоторые нюансы.
Использовать строку без инициализации можно, но нужно выделить под нее память.
В первом случае она выделяется статически, во втором просто объявляется указатель без выделения памяти.
...
fail
1
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
19.06.2011, 15:46 #8
grizlik78, ах ты чёрт, действительно, ошибочка вышла...
0
silentnuke
Android Programmer
139 / 140 / 10
Регистрация: 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];
0
19.06.2011, 15:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.06.2011, 15:46
Привет! Вот еще темы с решениями:

нужен совет по выводу
короче смотрите есть допустим во такой цикл for (int i=1;i&lt;=20;i++) { } в...

Что не хватает выводу?
#include &lt;iostream&gt;//управляет вводом-выводом #include &quot;Vjnkak.cpp&quot; #include...

Не работает программа по выводу чисел.
#include &lt;iostream&gt; using namespace std; void main () { int n, i=0, x, y;...

Нужен совет по выводу изображения
Привет, форумчане, я решил сделать простенькую игру в формате 3d делаю первый...


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

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

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