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

Указатели и строки - C++

Восстановить пароль Регистрация
 
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
05.12.2013, 22:50     Указатели и строки #1
Здравствуйте.
Учу указатели (и строки); появилась куча неясных мне моментов, поэтому прошу разъяснения.
1)
const char* obj {"nebula"};
cout << obj;

Почему здесь мы получим строку, а не адрес, как в случае бы с типом int* ? Я понимаю, что строка nebula как-бы являет собою (не понимаю как) адрес первого элемента, то бишь - 'n', но как компилятор понимает, что это строка?

2)
Совсем запутался. string {"nebula"} и cout << "nebula" : здесь аргументы инициализатора и оператора одного типа? А в случае string {"nebula"} и char[] {'n','e','b','u','l','a','\0'}?

3)
В листинге ниже неправильно считает количество элементов массива...
char ar[20] {"abcdef"};
char* ptr {ar};
int s {0};
while (*(ptr+s) != '\0')
cout << ar[s] << ++s;


При выполнении появляется такая штука, как "Ошибка сегментирования (core dumped)".

Помогите, плз!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.12.2013, 22:50     Указатели и строки
Посмотрите здесь:

указатели и строки? C++
Строки и указатели C++
C++ Строки и указатели........
Строки и указатели с++ C++
Указатели и строки C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
06.12.2013, 00:17     Указатели и строки #2
Цитата Сообщение от andrejap Посмотреть сообщение
но как компилятор понимает, что это строка?
В библиотеке есть перегруженный оператор для переданного типа данных. В примере со строкой - char const*.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.12.2013, 00:37     Указатели и строки #3
Цитата Сообщение от andrejap Посмотреть сообщение
3)
В листинге ниже неправильно считает количество элементов массива...
C++
1
2
3
4
5
6
7
8
char ar[20] {"abcdef"};
char* ptr {ar};
int s {0};
while (*(ptr+s) != '\0')
{
    cout << ar[s] ;
    cout << ++s;
}
Добавлено через 1 минуту
Цитата Сообщение от andrejap Посмотреть сообщение
2)
Совсем запутался. string {"nebula"} и cout << "nebula" : здесь аргументы инициализатора и оператора одного типа? А в случае string {"nebula"} и char[] {'n','e','b','u','l','a','\0'}?
http://www.cyberforum.ru/blogs/18334/blog97.html
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
06.12.2013, 17:25  [ТС]     Указатели и строки #4
Цитата Сообщение от Vourhey Посмотреть сообщение
В библиотеке есть перегруженный оператор для переданного типа данных. В примере со строкой - char const*.
Вы хотите сказать, что если для оператора << в STL как rvalue подается объект в скобочках, то он считает, что это уже и так адрес и нам его разыменовывать не нужно?? Не совсем понял...
Чуть по-иному построю вопрос:
int val = 8;
int* pval = &val;


Здесь, в случае cout << *pval компилятору ясно, что необходимо перейти по адресу в pval и прочесть значение, ибо pval хранит в себе этот адрес. Но где-же хранится адрес здесь: const char* obj {"nebula"}; ? Я вот вижу только nebula\0. Как изнутри это работает, на пальцах можно объяснить?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.12.2013, 17:51     Указатели и строки #5
Цитата Сообщение от andrejap Посмотреть сообщение
Но где-же хранится адрес здесь: const char* obj {"nebula"}; ?
Как где? В указателе obj. В данном случает, адрес, по которому расположен строковый литерал "nebula". Когда cout << получает указатель на char, он понимет его как адрес начала строки (в данном случае, адрес начала "nebula").

Добавлено через 7 минут
Если хотите вывести, с помощью cout <<, адрес строки, нужно привести указатель на строку к void*:
C++
1
2
const char* obj {"nebula"};
cout << (void*)obj;
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
06.12.2013, 18:06  [ТС]     Указатели и строки #6
А, кажется, начинаю понимать - ситуация со стоками такая из-за того, что нельзя встроенными типами передать набор символов как единый объект таких (встроенных) типов... Так?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.12.2013, 18:20     Указатели и строки #7
Цитата Сообщение от Vourhey Посмотреть сообщение
В библиотеке есть перегруженный оператор для переданного типа данных. В примере со строкой - char const*.
В зависимости от типа данных, будет использована та или иная перегрузка вывода. Для const char* используется такая, для int* - другая.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
06.12.2013, 20:10     Указатели и строки #8
Цитата Сообщение от andrejap Посмотреть сообщение
Здесь, в случае cout << *pval компилятору ясно, что необходимо перейти по адресу в pval и прочесть значение,
Вызовется просто оператор для int.
Ты осознаешь, что
blabla(char const*)
и
blabla(void const*)
Это разные функции и у них могут быть разные реализации?
Какая из функция вызовется при blabla("aaa"); а какая при
const int *a;
blabla(a);
догадываешься? Вот тебе и ответ. Одна функция реализована так, что выводит строку, другая так, что выводит значение указателя.

Добавлено через 5 минут

Не по теме:

неправильно прочитал первоначальное сообщение

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2013, 20:35     Указатели и строки
Еще ссылки по теме:

C++ Указатели и строки
Строки и указатели в C++ C++
C++ Указатели на строки

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

Или воспользуйтесь поиском по форуму:
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
06.12.2013, 20:35  [ТС]     Указатели и строки #9
А в принципе, ответ на мой вопрос-лейтмотив нашелся по той ссылке:
C++
1
"abc"
эквивалентно
C++
1
2
static char const __tmp_obj[] = "abc";
&__tmp_obj[0]
Yandex
Объявления
06.12.2013, 20:35     Указатели и строки
Ответ Создать тему
Опции темы

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