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

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

Войти
Регистрация
Восстановить пароль
 
TierX
20 / 20 / 0
Регистрация: 28.02.2014
Сообщений: 138
#1

Объяснить работу двух кодов - C++

30.06.2014, 05:21. Просмотров 294. Ответов 6
Метки нет (Все метки)

C++
1
2
    char a[]={"kakogo hrena?"};
    cout<<a<<endl; // kakogo hrena?
и
C++
1
2
    int a[]={11,22,33};
    cout<<a<<endl; // 001cfb50
Собсно почему в первом случае выводит весь символьный масив?
Должен ЖЕ выводить тоже что и во втором случае - адрес а. Почему так? И почему сразу весь масив...

попробывал через отдельный указатель. Кстати с этого примера все и началось увидел в книге и мозг повис. Что это? Что присваеваеться указателю? (результат тотже)
C++
1
2
    char *const p ={"kakogo hrena"};
    cout<<p<<endl; // kakogo hrena
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.06.2014, 05:21     Объяснить работу двух кодов
Посмотрите здесь:

Просьба объяснить работу std::thread в двух коротких примерах кода - C++
Доброго времени суток! Я использую std::thread чтобы поднять два разных потока. В первом случае всё работает хорошо. Во втором нет. ...

Объяснить работу функции - C++
Может кто объяснить работу функции void zagalovok() { Node *t; head=new Node(); t=head; int V; cout&lt;&lt;&quot;Введите...

Объяснить работу кода - C++
Подскажите пожалуйста как работает этот код при F(9). На экран выводит 131159, но как это происходит? void F(int n) { if (n &gt; 0) ...

Объяснить работу программы - C++
Здравствуйте. Такая задача была: Нашёл на форуме подходящую рабочую программу, но не могу полностью понять (и объяснить), как она...

Объяснить работу программы - C++
Во введенном слове подсчитать количество различных пар букв. Например, в слове babacabacd 5 различных пар букв, ba – 3 пары, ac – 2 пары. ...

Объяснить работу кода - C++
Объясните что происходит в данном коде #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include&lt;cmath&gt; int _tmain(int argc, _TCHAR*...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.06.2014, 05:43     Объяснить работу двух кодов #2
Цитата Сообщение от TierX Посмотреть сообщение
Собсно почему в первом случае выводит весь символьный масив?
Так cout устроен: если получает для вывода указатель на char, то трактует это как Си-строку, и будет выводить символы до '\0'.

Добавлено через 2 минуты
Поэтому, в частности, чтобы вывести, через cout, адрес массива char, нужно привести его к типу void*.
TierX
20 / 20 / 0
Регистрация: 28.02.2014
Сообщений: 138
30.06.2014, 05:55  [ТС]     Объяснить работу двух кодов #3
Цитата Сообщение от alsav22 Посмотреть сообщение
Так cout устроен: если получает для вывода указатель на char, то трактует это как Си-строку, и будет выводить символы до '\0'.

Добавлено через 2 минуты
Поэтому, в частности, чтобы вывести, через cout, адрес массива char, нужно привести его к типу void*.
Спасибо теперь более ясно.Но если можно то маленький пример приведите про void.
И в последнем примере несмотря на cout на что указывает p?(поидее на адрес первой буквы).

И как так создаеться масив без индификатора(имя) разве так можно?. Как его допустим в памяти потом искать без имени...
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.06.2014, 06:11     Объяснить работу двух кодов #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от TierX Посмотреть сообщение
Но если можно то маленький пример приведите про void.
C++
1
2
char a[] = "asdf";
cout << (void*)a << endl;
Добавлено через 5 минут
Цитата Сообщение от TierX Посмотреть сообщение
И в последнем примере несмотря на cout на что указывает p?(поидее на адрес первой буквы).
На адрес строкового литерала (где-то в статической памяти), можно сказать, что на адрес первой буквы.
Цитата Сообщение от TierX Посмотреть сообщение
создаеться масив без индификатора(имя) разве так можно?
В данном случае, массив не создаётся. Просто указатель p инициализируется адресом строкового литерала.
Цитата Сообщение от TierX Посмотреть сообщение
Как его допустим в памяти потом искать без имени...
По указателю. Так же как и объекты, создаваемые в динамической памяти с помощью new.
TierX
20 / 20 / 0
Регистрация: 28.02.2014
Сообщений: 138
30.06.2014, 06:33  [ТС]     Объяснить работу двух кодов #5
хм значит строковй литерал это нечто иное от символьного масива (я так понял зависит от какогото случая). будем гуглить спасибо.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.06.2014, 06:40     Объяснить работу двух кодов #6
Цитата Сообщение от TierX Посмотреть сообщение
Но если можно то маленький пример приведите про void.
Если массив, то можно и просто:
C++
1
cout << &a << endl;
Указатель нужно приводить к void*.

Добавлено через 5 минут
Цитата Сообщение от TierX Посмотреть сообщение
хм значит строковй литерал это нечто иное от символьного масива (я так понял зависит от какогото случая).
Строковый литерал - это тоже символьный массив, но создаётся в статической памяти (значит будет хранится всё время работы программы). Память, под таким массивом, только для чтения.
Когда же пишется так:
C++
1
char str[] = "kakogo hrena?";
то создаётся массив str на стеке (автоматический класс памяти), и в него копируется строковый литерал "kakogo hrena?". Такой массив можно использовать уже и для записи.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2014, 08:18     Объяснить работу двух кодов
Еще ссылки по теме:

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

Объяснить работу оператора switch - C++
Всем привет есть вопрос. В каком случае в блоке операторов caseнеобходимо использовать фигурные скобки? Вроде как, если используются...

Рекурсия, объяснить работу программы - C++
Вообщем мое ( пока самостоятельное ) обучение продолжается и попал я вот на такую замечательную тему как: &quot;рекурсия&quot;. вообщем все действия...

Объяснить на примере работу оператора ветвления if else - C++
как записать на с++ в ветвлении: если что то истинно ... что вставить сюда? if (finc (a, b, c)); \\ где можно вставить истинность?


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

Или воспользуйтесь поиском по форуму:
gru74ik
Модератор
Эксперт CЭксперт С++
3981 / 1728 / 193
Регистрация: 20.02.2013
Сообщений: 4,828
Записей в блоге: 21
30.06.2014, 08:18     Объяснить работу двух кодов #7
alsav22, интересные нюансы, благодарствую за ответы.
Yandex
Объявления
30.06.2014, 08:18     Объяснить работу двух кодов
Ответ Создать тему
Опции темы

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