![]() |
|
Модераторы: bsa |
![]()
|
|
| yngwie19 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
Я что-то совсем запутался. Чем отличается присваивание:
от
Почему в первом случае нет ошибок, Мне казалось, что присваивать строку указателю нельзя, однако все работает правильно. Во втором случае понятно происходит ошибка, а почему певый работает? Модератор: Название темы должно отражать ее суть! Это сообщение отредактировал(а) bsa - 18.12.2008, 23:37 |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
потому что любое выражение в кавычках, вида "any" именуемое строкой, компилятор снабжает завершающим нулем и помешает в секцию данных,
а вместо него подставляет указатель типа (const) char * с адресом на этот участок памяти. Это сообщение отредактировал(а) mes - 18.12.2008, 23:45 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
char *ptr - это указатель на переменную типа char
char ptr[10] - это массив переменных типа char (ему нельзя присвоить указатель). "name" - это строковый литерал. В твоем случае он представляется в виде константы типа const char *. По хорошему, присваивание не должно работать в обоих случаях (нельзя неконстантному указателю присвоить константный), но для строковых литералов было сделано исключение (для сохранения совместимости). кстати, ты можешь написать так: char ptr[10] = "name" или даже так: char ptr[] = "name". И это будет работать. Более того, во втором случае будет создан массив необходимого для хранения указанной строки размера автоматически. короче, пользуйся strcpy() |
|||
|
||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
mes, а почему тогда во втором случае ошибка, ведь ptr[10] это же есть указатель на первый элемент, т.е ptr.
|
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
во втором случае массив, его можно заполнить таким образом только на этапе инициализации, как показал bsa.
массив можно привести к char*, но не наоборот, a использовать operator [] можно у обоих Добавлено @ 23:57
а попробуйте поменять этот указатель , анапример так:
то что переменная-массива является указателем на первый элемент, совсем не значит, что она и переменная-указатель это одно и то же. Это сообщение отредактировал(а) mes - 18.12.2008, 23:58 |
||||
|
|||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
во втором случае Я не могу присвоить указатель на строку "name", т.к ptr[0] уже грубо говоря указывает на какой-то объект правильно?
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
||||
|
||||
| mes |
|
||||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
между
разница примерна такая же как и здесь :
не так. зачем выделять еше если ты уже выделил достаточно сторкой ptr [10] ?
Это сообщение отредактировал(а) mes - 19.12.2008, 00:06 |
||||||||
|
|||||||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
mes, нет если просто объявлять *p.
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Не смешиваете команды употребляемые в одной строчке в одно нераздилимое целое. У каждого смыслового словосочетания свой результат и вместе они определяют каким будет "предложение" :
Добавлено через 2 минуты и 24 секунды p это просто указатель. Он будет указывать на ту память на какую Вы ему скажете. |
|||
|
||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 5 Всего: 32 |
Тип строкового литерала - всегда не char * и не const char *. |
|||
|
||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
Последний вопрос, допустим Я сделаю так
у меня данная строка запишется в сегмент памяти и возвратится указатель, а если у меня например по адресу ptr[1] или ptr[2] были данные, которые использует программа, а Я их таким образом сотру, как быть тогда? Или при выделении памяти для "name" выбирается не используемый участок в памяти? |
|||
|
||||
| Сеппуку |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 15.12.2008 Репутация: нет Всего: нет |
char* ptr = "Some Text"; // В данном случае мы имеем указатель типа char char array[10]; // А в этом случае константный указатель типа char. Сщщемуеымуттщ присвоить ему что то можно только во время объявления переменной, но никак не позже. Короче говоря char array[10]; семантически эквивалентно char* const array = new char[10]; с той лишь разницей, что в первом случае массив помещается в стек, а во втором - память выделяется в куче. (кроме того для первого случая как правило будет проверяться длина массива во время инициализации) |
|||
|
||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 5 Всего: 32 |
Вот даже как Значит, если объявить массив в namespace scope, то он будет в стеке? Или если сделать его членом класса, а объект класса создать в динамической памяти - всё равно будет в стеке? А тут
ответ на оба вопроса в комментариях - "да"? |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |