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

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

Восстановить пароль Регистрация
 
TierX
 Аватар для TierX
19 / 19 / 0
Регистрация: 28.02.2014
Сообщений: 138
30.06.2014, 05:21     Объяснить работу двух кодов #1
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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.06.2014, 05:43     Объяснить работу двух кодов #2
Цитата Сообщение от TierX Посмотреть сообщение
Собсно почему в первом случае выводит весь символьный масив?
Так cout устроен: если получает для вывода указатель на char, то трактует это как Си-строку, и будет выводить символы до '\0'.

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

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

И как так создаеться масив без индификатора(имя) разве так можно?. Как его допустим в памяти потом искать без имени...
alsav22
5282 / 4801 / 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
 Аватар для TierX
19 / 19 / 0
Регистрация: 28.02.2014
Сообщений: 138
30.06.2014, 06:33  [ТС]     Объяснить работу двух кодов #5
хм значит строковй литерал это нечто иное от символьного масива (я так понял зависит от какогото случая). будем гуглить спасибо.
alsav22
5282 / 4801 / 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++
Объяснить результат и работу указанных строк C++
Объяснить работу Memcpy C++

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

Или воспользуйтесь поиском по форуму:
gru74ik
Модератор
 Аватар для gru74ik
3068 / 1313 / 164
Регистрация: 20.02.2013
Сообщений: 3,741
Записей в блоге: 15
30.06.2014, 08:18     Объяснить работу двух кодов #7
alsav22, интересные нюансы, благодарствую за ответы.
Yandex
Объявления
30.06.2014, 08:18     Объяснить работу двух кодов
Ответ Создать тему
Опции темы

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