4 / 4 / 5
Регистрация: 25.08.2016
Сообщений: 44
1

Конструкция const char* или указатель на временную строку

06.12.2017, 12:56. Показов 4679. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!
Вроде уже не первый день пишу на C++, но задался вопросом:
C++
1
2
3
4
5
int main(){
    const int*  a   = {1,2,3};
    const char* b   = "123";
    return 0;
}
Почему первая конструкция неправильная, а второй пользуются все. Ведь "123" - это временный объект, rvalue. Тогда как с ним можно обращаться через указатель?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.12.2017, 12:56
Ответы с готовыми решениями:

В программе имеется следующий фрагмент: const char a='*'; char ch; как объявится указатель-переменная
В программе имеется следующий фрагмент: const char a='*'; char ch; как объявляется...

CONST_RETURN char *__cdecl strstr (const char *_Str, const char *_SubStr)
#include <stdio.h> #include <string.h> char tracks = { "ya ostavil svoe serdce v harvardskom...

error: no matching function for call to `QObject::connect(QPushButton&, const char[10], QApplication*, const char[8])'
Ошибка понимаю какая, но не понимаю, почему возникла и как исправить!) #include <QtGui> int...

no matching function for call to 'QObject::connect(QCommandLinkButton*, const char*, cNetwork*, const char*)
компилятор ругается ошибка: no matching function for call to...

5
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
06.12.2017, 14:03 2
Лучший ответ Сообщение было отмечено teatralaik как решение

Решение

Там всё очень хитро.
Вот краткое описание: https://www.cyberforum.ru/blogs/18334/blog97.html (пункт 4)

Если коротко, в данном случае "123", это указатель на неявно созданный статический массив char, который хранится в rodata секции вашей программы.

Добавлено через 9 минут
По этой же причине можно корректно возвращать указатели на статические строки из функции:

C++
1
2
3
4
5
6
7
const char* strerr(int code) {
   switch(code) {
       case 0 : return "Ok";
       case -1 : return "SampleError";
       .....
   }
}
Реально никакой работы со строками не производится. Функция возвращает указатели на статические массивы, которые компилятор любезно создал где-то еще аж на этапе компиляции.
2
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
06.12.2017, 14:05 3
В таком варианте всё прекрасно компилируется:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
int main()
{
    const int  a[]   = {1,2,3};
    const char b[]   = "123";
 
    for (auto elem : a)
        std::cout << elem << ' ';
 
    std::cout << '\n';
    for (auto elem : b)
        std::cout << elem << ' ';
}
0
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
06.12.2017, 14:09 4
P.S. В ссылке на справочный материал, приведенной выше расказано, почему оно компилируется (пункт 2).
0
4 / 4 / 5
Регистрация: 25.08.2016
Сообщений: 44
06.12.2017, 14:25  [ТС] 5
Спасибо, то что надо
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
06.12.2017, 14:40 6
Аналог с интовым массивом
C++
1
2
static int p[] = {1, 2, 3};
const int *a = p;
В случае с char - это происходит неявно (создание массива в статической памяти). Почему? Потому что это из си пошло.
Сейчас Яндекс активно пропихивает пропозал с constexpr_allocator в С++20, так что возможно для контейнеров появится такой юз-кейз.
Но уже сейчас в С++17 есть std::string_view + operator""sv
0
06.12.2017, 14:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.12.2017, 14:40
Помогаю со студенческими работами здесь

Чем отличаются объявления const char* и const* char
Прошу объяснить мне, чем отличаются объявления const char* и const* char и как объявить: указатель...

Как присоединить одну строку к другой типа const char *
Создаю группу файло, передаю путь. Нужно соединить строки. const char *path=&quot;C:\\Program...

Копировать пустую строку в const char* Конструктор структуры (класса)
Я думал, что это копирует в ch символ конца строки char *ch=new char; strcpy(ch,&quot;&quot;); delete...

Как получить const BYTE *?(из string или char)
Есть строчку, которую может ввести юзер(строчка = путь к файлу). Нужно получить из этого cons BYTE...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru