Указатель char на строку. |
Здравствуйте, гость ( Вход | Регистрация )
Указатель char на строку. |
Гость_TheJax_* |
14.1.2016, 1:30
Сообщение
#1
|
Гости |
Добрый вечер уважаемые программисты. Очень хотелось бы разобраться с одним вопросом, а именно.
Вызывает ли компилятор неявно оператор new в данном случае:
И в этом случае:
Вот для символов Hello World! вызывается оператор new? Ведь указатель ptr указывает на какой-то адрес, как тогда этот адрес выделяется? И почему указатель ptr является константным ?? С указателем pp все ясно, там идет работа с копией строки "Hello World!", а вот с ptr не очень. Спасибо!!! |
|
|
Алексей1153 |
14.1.2016, 7:31
Сообщение
#2
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
не, new не вызывается. Выражение
Цитата "Hello World!"; возвращает указатель на константную строку, причём в конце строки обязательно будет 0 Сообщение отредактировал Алексей1153 - 15.1.2016, 8:38 |
|
|
lanz |
14.1.2016, 10:03
Сообщение
#3
|
Старейший участник Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: 8 |
В первом случае:
Компилятор знает сколько памяти нужно для строки и на этапе компиляции помещает строку в исполняемый файл. А в ptr загружается адрес строки. При исполнении загрузчик загружает строку в нужный адрес и все работает Во втором случае происходит http://en.cppreference.com/w/cpp/language/..._initialization Выделяется массив pp, который код инициализации заполняет нужной строкой. EDIT2: http://c-faq.com/decl/strlitinit.html Сообщение отредактировал lanz - 14.1.2016, 10:04 |
|
|
Гость_TheJax_* |
14.1.2016, 17:15
Сообщение
#4
|
Гости |
Алексей1153 и lanz, благодарю вас за ответы.
Если правильно понял, то в первом случае ( char *ptr), в этот самый ptr возвращается указатель на константную строку. Тогда скажите, пожалуйста, эквивалентны ли эти записи:
|
|
|
lanz |
14.1.2016, 17:35
Сообщение
#5
|
Старейший участник Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: 8 |
Цитата эквивалентны ли эти записи Нет конечно, вторая запись эквивалентна
Здесь массив просто вырождается(decay) в тип указателя:
Но указывает все равно на массив. Рекомендуется к прочтению: http://c-faq.com/~scs/cgi-bin/faqcat.cgi?sec=aryptr |
|
|
Гость_TheJax_* |
14.1.2016, 17:58
Сообщение
#6
|
Гости |
lanz, да, извиняюсь, чушь написал. Имелось ввиду следующее.
В первой строке ( char *ptr="Hello"; ) создается константная строка и указатель на константную строку ( "Hello" ). Похожа ли по смыслу вторая запись, т.е. ,что, есть константная строка, и есть указатель на нее. И ещё вопрос, почему компилятор пропускает этот кусок кода, строка же константная. Или компилятор не знает ещё об этом ?
Спасибо Вам за ответы! |
|
|
lanz |
14.1.2016, 18:03
Сообщение
#7
|
Старейший участник Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: 8 |
На практике разница такая:
http://rextester.com/OZME60022 Цитата строка же константная Нет, она же char* Процитирую первую ссылку: Цитата it turns into an unnamed, static array of characters, and this unnamed array may be stored in read-only memory, and which therefore cannot necessarily be modified. In an expression context, the array is converted at once to a pointer, as usual (see section 6), so the second declaration initializes p to point to the unnamed array's first element. Some compilers have a switch controlling whether string literals are writable or not (for compiling old code), and some may have options to cause string literals to be formally treated as arrays of const char (for better error catching). may, may, may т.е. это не обязательно. Сообщение отредактировал lanz - 14.1.2016, 18:04 |
|
|
Гость_TheJax_* |
14.1.2016, 18:15
Сообщение
#8
|
Гости |
lanz, дошло, спасибо Вам )).
Касательно Ваших двух примеров. А почему во втором случае возвращается мусор? Из-за того, что, массив "а" создается на стеке и выходя за пределы функции данные ( массив "а" ) уничтожается и указатель указывает на мусор ? Так ? |
|
|
lanz |
14.1.2016, 18:20
Сообщение
#9
|
Старейший участник Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: 8 |
Цитата массив "а" создается на стеке и выходя за пределы функции данные ( массив "а" ) уничтожается В целом да. Вообще это детали реализации где он создается, более важно что время его жизни ограничено областью функции, т.к. это локальная переменная. Сообщение отредактировал lanz - 14.1.2016, 18:21 |
|
|
Гость_TheJax_* |
14.1.2016, 18:24
Сообщение
#10
|
Гости |
lanz, все понятно. Спасибо Вам огромное!
|
|
|
Текстовая версия | Сейчас: 28.11.2024, 23:19 |