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

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

Войти
Регистрация
Восстановить пароль
 
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
#1

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

05.12.2013, 22:50. Просмотров 333. Ответов 8
Метки нет (Все метки)

Здравствуйте.
Учу указатели (и строки); появилась куча неясных мне моментов, поэтому прошу разъяснения.
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++
1. С клавиатуры вводится полный путь к файлу. Напишите программу, которая выделяет из этой строки имя файла Пример: ...

Указатели и строки - C++
1. В коде есть такой кусок: sc = stack.pop(); printf(&quot;#%s %d#&quot;, &amp;sc, sc); sc имеет тип unsigned int, понятно что там хранится...

Строки и указатели в C++ - C++
Проверить правильность расположения в тексте круглых скобок (количество открывающихся и закрывающихся скобок должно совпадать). Пользуясь...

указатели и строки? - C++
Люди помогите понять, ни как не дается это страшное слово указатель. Так в общем немного ясно, не понятно вот что: Считается что эти...

Указатели на строки - C++
Есть следующий код: class Strings // класс с указателями на строки (размер которого равен 8) { public: char* str1; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
06.12.2013, 00:17     Указатели и строки #2
Цитата Сообщение от andrejap Посмотреть сообщение
но как компилятор понимает, что это строка?
В библиотеке есть перегруженный оператор для переданного типа данных. В примере со строкой - char const*.
alsav22
5416 / 4812 / 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
5416 / 4812 / 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
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.12.2013, 18:20     Указатели и строки #7
Цитата Сообщение от Vourhey Посмотреть сообщение
В библиотеке есть перегруженный оператор для переданного типа данных. В примере со строкой - char const*.
В зависимости от типа данных, будет использована та или иная перегрузка вывода. Для const char* используется такая, для int* - другая.
Vourhey
Почетный модератор
6477 / 2252 / 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++
Доброго всем времени суток! Не понимаю почему указатели на строки возвращают всю строку char может содержать только один символ в...

Строки и указатели - C++
Выполнить задание двумя способами используя индексы и используя указатели при работе со строками. Удалить в строке все буквы “b”,...

Задания на строки и указатели - C++
Помогите с заданиями пожалуйста.. 1.4.1. Длина строки В файле str.c напишите функцию вычисления длины строки (str_lenght). Саму...


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

Или воспользуйтесь поиском по форуму:
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     Указатели и строки
Ответ Создать тему
Опции темы

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