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

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

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

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

19.06.2011, 15:18. Просмотров 1423. Ответов 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++):

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

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

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

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

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

Вывод двух символьных массивов, завершающий символ - C++
Товарищи! Помогите разобраться.... Вот простейшая программа: int main() { setlocale(0, &quot;&quot;); char str1 = { 'м', 'а', 'р',...

8
silent_1991
Эксперт С++
4985 / 3042 / 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;
2
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
19.06.2011, 15:36 #3
Угу, но только если str это именно массив, а не указатель на строку.
универсальный способ, всё-таки, такой:
C++
1
std::cout << reinterpret_cast<void*>(&str[n]) << std::endl;
1
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 без инициализации)
Просто сейчас пытаюсь разобраться со строками и указателями, но непонятны некоторые нюансы.
0
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
19.06.2011, 15:43 #5
Цитата Сообщение от Seatless Посмотреть сообщение
Хм, спасибо. Но я все равно не совсем понял почему именно так. Ведь например, если сделать так:
&str имеет тип не char*, а char**, поэтому трактуется уже не как строка, а как адрес. Кстати, поэтому способ silent_1991 не только не универсальный, но и работать правильно может только при n == 0.
1
silent_1991
Эксперт С++
4985 / 3042 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
19.06.2011, 15:44 #6
1. Потому что всё зависит от типа указателя. Вывод указателя на int заставляет вывести адрес, а вот вывод указателя на char - именно строку.
2. Потому что arr[20] - массив, под который выделена память (занимает в памяти 20 * sizeof(char) байт и имеет определённый адрес), а *arr - просто указатель, который указывает на случайную область памяти (содержит мусор). Мы не можем просто взять и записать строку в случайную область памяти, потому как в ней могут находиться критические для работы программы данные.
1
diagon
Higher
1930 / 1196 / 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
1
silent_1991
Эксперт С++
4985 / 3042 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
19.06.2011, 15:46 #8
grizlik78, ах ты чёрт, действительно, ошибочка вышла...
0
silentnuke
Android Programmer
139 / 140 / 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];
0
19.06.2011, 15:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.06.2011, 15:46
Привет! Вот еще темы с ответами:

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

Что не хватает выводу? - C++
#include &lt;iostream&gt;//управляет вводом-выводом #include &quot;Vjnkak.cpp&quot; #include &lt;stdio.h&gt;//заголовочный файл стандартной библиотеки языка...

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

Работа с файлами мешает выводу - C++
Массив структур, в ней две структуры. Инициализация проводится с файла 123.тхт находящимся в каталоге с программой. В этой программе я...


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

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

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