12 / 12 / 5
Регистрация: 03.06.2016
Сообщений: 169
1

Использование указателя на константную строку

16.05.2018, 07:06. Показов 3296. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.

Почему так
C++
1
2
char* kk = "345345";
kk[1] = 0x00;
компилятор ругается, а так
C++
1
2
char* kk = new char[10];
kk[0] = 0xff;
нет.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.05.2018, 07:06
Ответы с готовыми решениями:

Указатель на константную текстовую строку
С точки зрения стандарта это валидный код? int main() { char* pproverb{ "A miss is as good as...

Возвращение неконстантного указателя из константного указателя на строку
Не могу до конца понять один момент. Допустим, у нас есть функция searchSymbol, которая принимает...

Как можно хранить константную строку из символов кириллицы и работать с ней?
1. Как можно хранить константную строку из символов кириллицы и работать с ней? const char msg =...

Указатель на константную строку и имя массива как указатель
Изучаю C. У меня есть указатель на константную строку, и я хочу его изменить путем передачи в...

4
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
16.05.2018, 07:55 2
Цитата Сообщение от MINO Посмотреть сообщение
char* kk = "345345";
Это указатель на костантные данные. Читайте про с-строки.
Вкратце:
В С++ есть только один указатель, который может инициализироваться адресом памяти для данных задаваемых литералом, которая выделяется компилятором автоматически и никогда не освобождается. Данные являются констными, как уже скахано. Это из С.
1
585 / 488 / 371
Регистрация: 05.11.2013
Сообщений: 1,265
Записей в блоге: 6
16.05.2018, 07:56 3
Лучший ответ Сообщение было отмечено MINO как решение

Решение

После присваивания
C++
1
char* kk = "345345";
в kk хранится некий адрес, по которому размещена строка "345345". Компилятор обычно размещает ее в памяти, которая "read only" (конечно, теоретически туда можно писать, просто операционная система знает, что это неправильно и пресекает попытки записи).

Так сделано для оптимизаций и упрощения. Пусть в Вашей программе есть ещё десять мест, где есть константа "345345". Компилятор не будет создавать 11 копий, а будет использовать один и тот же адрес. А теперь представьте, что вышеуказанное изменение разрешено.

Старые компиляторы этого не делали и часто наблюдались интересные спецэффекты, когда константы изменяли свое значение.

Также нужно различать константный указатель и указатель на константу.

1) Указатель на константу: нельзя менять содержимое объекта, на который указывает указатель, но можно менять содержимое самого указателя (указатель — это переменная, содержащая адрес другой переменной).

C++
1
2
3
4
char array[] = "string";
const char * с = array; // Указатель на объект, который нельзя менять
c[1] = 'a';             // Нельзя, т. к. меняется содержимое указываемого объекта
с = "345";              // Можно, т. к. меняется значение самого указателя
2) Константный указатель: можно менять содержимое объекта, но нельзя менять значение самого указателя. Проще говоря, указатель нельзя переназначить на другой объект, но сам указатель поменять можно.

C++
1
2
3
4
char array[] = "string";
char * const с = array;
c[1] = 'a';    // можно
с = "345";     // нельзя
Во втором же случае всё понятно, мы выделяем новую память в "куче" и можем делать с ней, что захотим.
1
12 / 12 / 5
Регистрация: 03.06.2016
Сообщений: 169
16.05.2018, 17:09  [ТС] 4
Недогледел что летерал это константа. Но в случае char array[] = "string"; мы создаем константу, непонятно как с помощью манипуляции char * const с = array
указателя можно менять эту константу?
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
16.05.2018, 18:54 5
Цитата Сообщение от MINO Посмотреть сообщение
непонятно как с помощью манипуляции char * const с = array
указателя можно менять эту константу?
Это другой случай. Для массива, литерал берется для копирования в массив. Синтаксис "полу-сишный"? как и почти всё для char. Без литералов трудновато жить. int a = 1; тоже инициализация при помощи литерала, но последовательность не та, что у char*. То есть, массив char можно инициализировать не только списком, а ещё и строковым литералом. При этом, строка используется для копирования в массив. В реальной жизни компилятор сам всё построит и не будет создана пееременная const char* из литерала, чтобы её потом копировать в память для массива.
1
16.05.2018, 18:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.05.2018, 18:54
Помогаю со студенческими работами здесь

Использование указателя this
Доброго времени суток Ошибка при первом использовании указателя this, не в ходе компиляции, а как...

Использование указателя this
Здравствуйте. Помогите пожалуйста сделать такое приложение на С++: Создать класс массив,...

Использование указателя this
Есть класс пользователя в к нему нужно реализовать: 1) setEmail(char* email): void - изменение...

Использование указателя this
Вообщем решил я задачу: файл 1: // stack.h -- class definition for the stack ADT #ifndef...


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

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

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