Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
MINO
12 / 12 / 5
Регистрация: 03.06.2016
Сообщений: 127
Завершенные тесты: 1
1

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

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

Здравствуйте.

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

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

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

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

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

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

4
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7299 / 3555 / 486
Регистрация: 04.12.2011
Сообщений: 10,038
Записей в блоге: 5
16.05.2018, 07:55 2
Цитата Сообщение от MINO Посмотреть сообщение
char* kk = "345345";
Это указатель на костантные данные. Читайте про с-строки.
Вкратце:
В С++ есть только один указатель, который может инициализироваться адресом памяти для данных задаваемых литералом, которая выделяется компилятором автоматически и никогда не освобождается. Данные являются констными, как уже скахано. Это из С.
1
ПерС
431 / 356 / 322
Регистрация: 05.11.2013
Сообщений: 1,009
Записей в блоге: 6
Завершенные тесты: 1
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
MINO
12 / 12 / 5
Регистрация: 03.06.2016
Сообщений: 127
Завершенные тесты: 1
16.05.2018, 17:09  [ТС] 4
Недогледел что летерал это константа. Но в случае char array[] = "string"; мы создаем константу, непонятно как с помощью манипуляции char * const с = array
указателя можно менять эту константу?
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7299 / 3555 / 486
Регистрация: 04.12.2011
Сообщений: 10,038
Записей в блоге: 5
16.05.2018, 18:54 5
Цитата Сообщение от MINO Посмотреть сообщение
непонятно как с помощью манипуляции char * const с = array
указателя можно менять эту константу?
Это другой случай. Для массива, литерал берется для копирования в массив. Синтаксис "полу-сишный"? как и почти всё для char. Без литералов трудновато жить. int a = 1; тоже инициализация при помощи литерала, но последовательность не та, что у char*. То есть, массив char можно инициализировать не только списком, а ещё и строковым литералом. При этом, строка используется для копирования в массив. В реальной жизни компилятор сам всё построит и не будет создана пееременная const char* из литерала, чтобы её потом копировать в память для массива.
1
16.05.2018, 18:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2018, 18:54

Использование указателя на функцию
нужна помощь с переделкой кода. имеющийся код который вычисляет максимально из 2 чисел, нужно...

Использование указателя на функцию
void treug (float a, float b, float c, int*p) { p=0; if ((a+b>c) || (b+c>a) || (c+a>b)) { ...

Использование ссылки и указателя
Доброго времени суток! Возник такой вопрос, есть код: #include <iostream> #include <cmath>...


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

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

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