325 / 304 / 173
Регистрация: 16.11.2010
Сообщений: 1,069
Записей в блоге: 9
1

Чем отличается const char* от char*?

01.06.2018, 12:51. Показов 13977. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго всем дня!
Из матчасти я понимаю, что char* - это указатель массив символов, тогда как const char* - это константный указатель на массив символов.

Но вот чего не понимаю
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
#include <cstring>
#include <cstdlib>
 
using namespace std;
 
int main()
{
    char* a = "mur ";
    const char * b = "2";
    char* arr = strcat(a,b);
    cout << arr << endl;   
 
    return 0;
}
Почему на strcat выпадает ошибка? Хотя входящие типы данных полностью соответствуют сигнатуре..

У меня получилось запустить эту функцию в таком виде:
C++
1
2
3
4
5
6
7
    
    int c=5;
    char ar[2];
    itoa(c,ar,10);
 
    char* arr = strcat(ar,"2333");
    cout << arr << endl;
И даже в таком виде:
C++
1
2
3
    char* b = "2333";
    char* arr = strcat(ar,b);
    cout << arr << endl;
где b - даже неконстантный указатель, то есть не соответствует сигнатуре, но заработало. В чем разница между

Код
char ar[2];
и
Код
char* a = "mur ";
Это ж по идее один и тот же тип данных?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.06.2018, 12:51
Ответы с готовыми решениями:

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

Строка: чем отличается строки string, char, char*?
Помогите разобраться,совсем плохо идёт,чем отличается строки string,char,char* И если можно пару...

Ошибка: "char *concat(char *,.)": невозможно преобразовать аргумент 1 из "const char [4]" в "char *"
делал задание, но на строке 36 строке пишет, что &quot;char *concat(char *,...)&quot;: невозможно...

Error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *'
error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *' void...

5
зомбяк
1581 / 1215 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
01.06.2018, 13:36 2
Цитата Сообщение от netBool Посмотреть сообщение
char* - это указатель массив символов, тогда как const char* - это константный указатель на массив символов
Нет. char* - указатель на символ. То есть для того, чтоб char* а стал указателем на первый символ из массива, нужно сделать так:
C++
1
2
char ar[2];
char* a = ar;
Добавлено через 7 минут
А строковые литералы наподобие "mur " - это константы, точно такие же как например числа. Ты же в своём коде не пытаешься присваивать
C++
1
2
6 = 2;
2*2 = 5;
ведь так?

Касательно strcat -
The behavior is undefined if the destination array is not large enough for the contents of both src and dest and the terminating null character.
то есть ты обязан создать массив, в который всё гарантированно поместится, и только после этого применять данную функцию. То есть

C++
1
2
3
4
5
6
7
8
9
int main()
{
    char a[6] = "mur ";
    const char * b = "2";
    char* arr = strcat(a,b); // 4 символа исходной строки + 1 добавленный символ + символ конца строки = нужно 6 символов
    cout << arr << endl;   
 
    return 0;
}
Добавлено через 4 минуты
По поводу всего этого можешь прочитать подробнее тут - https://www.cyberforum.ru/blogs/18334/blog97.html

А вообще гораздо проще будет работать с std::string. Всё-таки вышеописанные строки и функция strcat - наследие С.
1
325 / 304 / 173
Регистрация: 16.11.2010
Сообщений: 1,069
Записей в блоге: 9
01.06.2018, 13:40  [ТС] 3
Цитата Сообщение от TRam_ Посмотреть сообщение
ведь так?
Вот этот момент, мне пожалуй, и не понятен
C++
1
char* a = "mur ";
ведь по сути это это тоже массив. А char* - указатель на 1й элемент массива....
Короче, если мои мысли текут в верном направлении, то "mur " будет храниться как константа в секции .text, куда запись запрещена, поэтому и ошибка...
Цитата Сообщение от TRam_ Посмотреть сообщение
то есть ты обязан создать массив, в который всё гарантированно поместится, и только после этого применять данную функцию. То есть
Понял, спасибо
0
2330 / 796 / 302
Регистрация: 10.02.2018
Сообщений: 1,861
01.06.2018, 13:49 4
b - даже неконстантный указатель, то есть не соответствует сигнатуре
Вот тут как раз всё в порядке. Указатель автоматически преобразуется к нужному типу. Если это невозможно, то выдаётся сообщение об ошибке компиляции. Константный модификатор в аргументах подчёркивает, что запись по этому указателю в процессе работы функции не планируется, только чтение. Передавать в таком аргументе можно как обычный указатель, так и константный, в отличие от ситуации, когда аргумент объявлен не как константный.

Цитата Сообщение от netBool Посмотреть сообщение
"mur " будет храниться как константа в секции .text, куда запись запрещена, поэтому и ошибка
Да, при компиляции под виндой так и получается. Фактически, тип указанный компилятору не соответствует содержимому. Протектор памяти не позволяет запись, хоть тип объявлен как char*. Для кода
C++
1
char[] = "mur "
происходит выделение памяти в допустимом для записи месте и копирование туда строки из константной секции.
1
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
01.06.2018, 14:00 5
Цитата Сообщение от netBool Посмотреть сообщение
Из матчасти я понимаю, что char* - это указатель массив символов, тогда как const char* - это константный указатель на массив символов.
Это неверно. Да, char* - это указатель на неконстантный массив символов. Но const char*, а равно и char const* - это неконстантный указатель на константный массив символов. В то же время char* const - константный указатель на неконстантный массив символов. Но хлеще всех const char* const - константный указатель на константный массив символов.
1
325 / 304 / 173
Регистрация: 16.11.2010
Сообщений: 1,069
Записей в блоге: 9
01.06.2018, 16:11  [ТС] 6
Цитата Сообщение от Ygg Посмотреть сообщение
Для кода
И верно. Спасибо
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.06.2018, 16:11
Помогаю со студенческими работами здесь

Проблема с несовместимостью типов параметров char, const char, STRSAFE_LPWSTR, STRSAFE_LPCWSTR
Проблемные вопросы отражены на скрине Программа написана к заданию: 1. Разработать прикладной...

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

Строки: почему компилятор пишет , что переменная типа char несовместима с const char?
char pass; int password( int d) { int m; char p; cout &lt;&lt; &quot;Введите пароль для доступа к...

[Ошибка] invalid conversion from 'const char*' to 'char*' [-fpermissive]
Решал задачи сам по себе, наткнулся на очень интересную. Вот сама задача: Вы оператор пуска ...


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

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

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