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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Vegas_I
1 / 1 / 0
Регистрация: 28.02.2013
Сообщений: 103
#1

Указатель на строковую константу. В чем отличие двух приведенных примеров - C++

27.01.2014, 14:40. Просмотров 1410. Ответов 28
Метки нет (Все метки)

char *x;
x = "Текст"; это указатель на строковую константу.

char x[]="Текст"; - строка(т.е. массив символов).


В чём отличие двух вышеописанных примеров? Ведь и там и там х -это указатель на начало массива. Почему в первом случае строка - это константа, а во втором нет?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2014, 14:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатель на строковую константу. В чем отличие двух приведенных примеров (C++):

Указатель на строковую константу - C++
Всем привет. Я знаю что в С++ в основном юзается std::string,но сишные строки тоже желательно знать. Вроде все просто, только функции...

Указатель на строковую константу - C++
Здравствуйте уважаемые форумчане! Подскажите пожалуйста является ли эта ситуация выходом за пределы массива или размер массива...

Как в классе создать строковую константу? - C++
Как в классе создать строковую константу? Конструкция типа static const char __tmp_obj1 = "abc"; не работает.

Преобразование в указатель на указатель на константу - C++
В упор не могу понять правила которые приводит Дьюхерст для преобразований "многоуровневых" указателей. (Дьюхерст "Скользкие места...

ссылка на указатель на константу. Не могу врубиться - C++
Добрый вечер! Не подскажите почему только выражение с pi_ref3 верное, а остальные - нет (VS 2013). Выражение с pi_ref1 вроде как-то...

Константный указатель на константу меняет значение - C++
int d = 7; const int* const cd = &d; d = 8; qDebug()<<*cd;

28
НеСказочник
58 / 46 / 8
Регистрация: 12.11.2012
Сообщений: 356
Записей в блоге: 2
27.01.2014, 14:53 #2
При запуске приложения ему выделяется его личный сегмент памяти и все переменные, вроде
C++
1
char x[]="Текст"
, хранятся там. эта память очень быстрая, но надо заранее знать сколько попросить, ибо расширять сегмент по ходу дела нельзя. А ещё есть так называемая куча , в которой можно по ходу дела забить столько места, сколько нужно. Но тогда тебе нужно хранить адрес начала той части кучи, в которой хранятся твои данные, например
C++
1
char *x = "Текст";
. Все переменные в которых между типом и названием стоит завёздочка - хранят только адреса памти, а сами данные хранятся в куче.

Очень важно помнить, что после использования кучи в ней надо прибраться при помощи конструкций вида
C++
1
delete x;
, что бы куча памяти не превратилась в кучу мусора.
0
Vegas_I
1 / 1 / 0
Регистрация: 28.02.2013
Сообщений: 103
27.01.2014, 14:58  [ТС] #3
Тогда получается, что
C++
1
char *x = "Текст";
это своего рода динамический массив, а значит можно изменять и размер и содержимое. Но в книжках написано, что это константа(т.е. изменять нельзя). Получается противоречие. Где я ошибаюсь?
0
НеСказочник
58 / 46 / 8
Регистрация: 12.11.2012
Сообщений: 356
Записей в блоге: 2
27.01.2014, 15:04 #4
Не путай динамический массив с массивом в динамической памяти.

Добавлено через 41 секунду
И это не константа, так как нигде нет
C++
1
const
Добавлено через 1 минуту
Ты ведь не можешь написать
C++
1
int*A=new int[32];
, а потом обратиться
C++
1
A[45]=0;
Добавлено через 1 минуту
Можно только переопределить массив с новым размером, но тогда все данные в старом потеряются.

Добавлено через 1 минуту
Так и со строками.
C++
1
2
3
char *x = "Текст"; 
*x = "ТекстТекст"; 
 *x = "ТекстТекстТекстТекст";
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,534
Завершенные тесты: 1
27.01.2014, 15:07 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Vegas_I, вот здесь можете популярно почитать: Строковые литералы в Си/Си++ .
1
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
27.01.2014, 16:12 #6

Не по теме:

Цитата Сообщение от НеСказочник Посмотреть сообщение
И это не константа, так как нигде нет
прикольно



Добавлено через 1 минуту
Цитата Сообщение от НеСказочник Посмотреть сообщение
Ты ведь не можешь написать

C++
1
int*A=new int[32];
, а потом обратиться

C++
1
A[45]=0;
молодой человек, а кто сказал что так нельзя ?)
0
НеСказочник
58 / 46 / 8
Регистрация: 12.11.2012
Сообщений: 356
Записей в блоге: 2
27.01.2014, 16:14 #7
Цитата Сообщение от aLarman Посмотреть сообщение
молодой человек, а кто сказал что так нельзя ?)
Написать-то всё можно, только вот результат будет непредсказуемый. VS, к примеру, может вылететь с криками о повреждении кучи или даже найти где-то точку останова, которой ни кто не ставил.
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
27.01.2014, 16:17 #8
Цитата Сообщение от НеСказочник Посмотреть сообщение
Написать-то всё можно, только вот результат будет непредсказуемый. VS, к примеру, может вылететь с криками о повреждении кучи или даже найти где-то точку останова, которой ни кто не ставил.
а если собрать в релизе а не в дебаге ?) может ничего и не произойти, а потом у вас почему то упадет Word

Добавлено через 1 минуту
такое обращение undefined behavior и к чему он приведет....известно только великому китайскому рандому
0
НеСказочник
58 / 46 / 8
Регистрация: 12.11.2012
Сообщений: 356
Записей в блоге: 2
27.01.2014, 16:19 #9
В любом случае так нельзя. Если попросил 32 то и пользуй 32.

Добавлено через 1 минуту

Не по теме:

прикольно
кстати, что именно прикольно

0
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,072
27.01.2014, 16:22 #10
Цитата Сообщение от НеСказочник Посмотреть сообщение
char *x = "Текст";
ты серьезно считаешь что память выделится в куче?
и обязательно нужен
Цитата Сообщение от НеСказочник Посмотреть сообщение
delete x
ну ежли желаешь краха программы то да
память в куче выделяется new и только для него удаление delete
или malloc удаление у него free
а
Цитата Сообщение от НеСказочник Посмотреть сообщение
char *x = "Текст";
равносилен
Цитата Сообщение от Vegas_I Посмотреть сообщение
char x[]="Текст";
0
aLarman
27.01.2014, 16:30
  #11

Не по теме:

Цитата Сообщение от НеСказочник Посмотреть сообщение
кстати, что именно прикольно
Ваши слова что
Цитата Сообщение от НеСказочник Посмотреть сообщение
И это не константа, так как нигде нет
C++
1
const

0
Убежденный
Системный программист
Эксперт С++
15689 / 7199 / 1138
Регистрация: 02.05.2013
Сообщений: 11,636
Записей в блоге: 1
Завершенные тесты: 1
27.01.2014, 16:32 #12
Цитата Сообщение от Vegas_I Посмотреть сообщение
Тогда получается, что это (char *x = "Текст")
своего рода динамический массив, а значит можно изменять и размер и содержимое.
Но в книжках написано, что это константа(т.е. изменять нельзя).
Получается противоречие. Где я ошибаюсь?
"Текст" в данном случае - это строковой литерал.
По стандарту языка C++, строковые литералы константны, а попытка их
изменения ведет к неопределенному поведению. Цитирую:

C++03, 2.13.4 String literals
1. A string literal is a sequence of characters (as defined in 2.13.2) surrounded
by double quotes, optionally beginning with the letter L, as in "..." or L"...".
A string literal that does not begin with L is an ordinary string literal, also
referred to as a narrow string literal. An ordinary string literal has type "array of n
const char"
and static storage duration (3.7), where n is the size of the string as
defined below, and is initialized with the given characters. A string literal that
begins with L, such as L"asdf", is a wide string literal. A wide string literal has
type "array of n const wchar_t"
and has static storage duration, where n is the size
of the string as defined below, and is initialized with the given characters.

2. Whether all string literals are distinct (that is, are stored in nonoverlapping
objects) is implementation defined. The effect of attempting to modify a string
literal is undefined
.
0
НеСказочник
58 / 46 / 8
Регистрация: 12.11.2012
Сообщений: 356
Записей в блоге: 2
27.01.2014, 16:44 #13
Извиняюсь, поспешил ответить и напутал.
0
Kuzia domovenok
1892 / 1747 / 119
Регистрация: 25.03.2012
Сообщений: 5,936
Записей в блоге: 1
27.01.2014, 17:00 #14
Тут кто-то упомянул что из-за UB может "word упадёт". Не говорите глупости! Приложение из-за ошибок работы с указателями может попортить свою память и упасть, но уж соседний "word" никак не "упадёт"!
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
27.01.2014, 17:18 #15
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Приложение из-за ошибок работы с указателями может попортить свою память
т.е в соседний процесс не попадет?
0
27.01.2014, 17:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2014, 17:18
Привет! Вот еще темы с ответами:

В чём отличие константного указателя и указателя на константу? - C++
int *const p1 и int const* p2 Объясните мне в чём тут отличие.

Указатель или ссылка на указатель. В чем разница? - C++
Есть вопрос про указатели и ссылки на указатели :scratch: Хочу в функциях f1() и в f2() динамически выделить память и возвратить этот...

В чем отличие While от Do... While? - C++
Я понял ,что в While сначала проверяется условие,а потом если оно истинно выполняются операторы,а в Do...while все наоборот . Как я...

В чем отличие с++ и visual c++ ? - C++
выбирая книгу,по программированию на языке с++ на этом сайте, наткнулся на разделение в отдельные классы C++ и Visual C++, объясните...


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

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

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