27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
|
||||||
1 | ||||||
char *19.04.2012, 10:48. Показов 1993. Ответов 25
Метки нет (Все метки)
Я правильно понимаю, что
что тогда произойдет с q и w? Если неправильно понимаю, объясните, что значат эти 2 строчки
0
|
19.04.2012, 10:48 | |
Ответы с готовыми решениями:
25
Char unsigned char signed char длинна Кааак Ошибка: "char *concat(char *,.)": невозможно преобразовать аргумент 1 из "const char [4]" в "char *" (std::basic_string<char, std::char_traits<char>, std::allocator<char> > const& Error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *' |
19.04.2012, 11:01 | 2 | |||||
Да ты всё верно понимаешь.
Что произайдёт с символами? Да ничего не произойдет. Они будут находиться в том месте где и были изначально. В том пространстве в котором размещается программа. Проверить мои слова ты можешь вот так
0
|
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
|
|
19.04.2012, 11:08 [ТС] | 3 |
stawerfar, а не критично то, что память, которая выделялась под них не освобождается после mas+=1, например?
0
|
19.04.2012, 11:20 | 4 |
Для ясности поясню что в данном случае память выделяется в куче как для простых локальных переменных если вы объявляли данную конструкцию теле какой нибудь функции или метода. Тогда память будет освобождена автоматом после выхода из тела функции,метода или модуля. Если же вы использовали эту конструкцию в глобальной области видимости то память будет освобождена только после окончания программы.
Если же бы вы выделяли бы память динамически ну например вот так char * mas = new char[20]; strncpy(mas,"qwer",20); то в этом случае программист обязан следить за своевремменым освобождение памяти, так как после выхода из тела функции или метода класса память не освобождается а становиться не доступной. Это связано с спецификой оператора new. Он возращает указатель на начало участка памяти который свободен и может разместить указанный размер информации. По этому нужно следить за освобождением. Хотя и это не криично т.к. полсе завершения программы эта память тоже будет освобождена. Утечка памяти опасна в локальных методах особенно если это вызывается очень большое количество раз.
0
|
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
|
||||||
19.04.2012, 11:44 [ТС] | 5 | |||||
stawerfar, кстати, помню, читал литературу, там было сказано, что писать так нельзя:
Однако читая разные примеры, сталкиваюсь с такой записью. Так кто же прав?
0
|
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
|
|
19.04.2012, 11:47 | 6 |
0
|
Заблокирован
|
||||||
19.04.2012, 11:56 | 7 | |||||
Что такое chbuff += 2; - это сдвиг указателя на 2 символа да строка станет теперь "erty".
Теперь по поводу этого - нет это заблуждение, строка как была так и будет в памяти. Чтобы было понятно что "строка не страдает от сдвига" предлагаю код ниже
str : qwerty (adr : 0012FF7C) ptr : qwerty (adr : 0012FF78) str : erty (adr : 0012FF7C) ptr : qwerty (adr : 0012FF78) Для продолжения нажмите любую клавишу . . .
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
||||||
19.04.2012, 12:08 | 8 | |||||
Ksan, в Вашем случае просто объявляется указатель на char. Нельзя делать так как в первом посте. Так как там указатель указывает на строковый литерал, который по своей сути является констатным. По этому указатель должен объявляться как указатель на константные данные.
0
|
Заблокирован
|
||||||
19.04.2012, 12:14 | 10 | |||||
Toshkarik, ты вообще о чём
str : qwerty (adr : 0012FF7C) ptr : qwerty (adr : 0012FF78) str : erty (adr : 0012FF7C) ptr : qwerty (adr : 0012FF78) Для продолжения нажмите любую клавишу . . . Ниже мнемосхема того что происходит str [q]werty ptr [q]werty str = str + 2 ptr [q]werty str qw[e]rty
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
19.04.2012, 12:20 | 11 |
-=ЮрА=-, о том, что в первом посте для инициализации использовался строковый литерал, в твоем же примере ты отдельно выделяешь под строки память. При компиляции кода из первого поста нормальный компилятор выдаст предупреждение, о том, что типу char * присваивается const char *.
0
|
Заблокирован
|
|
19.04.2012, 12:30 | 12 |
какой компилятор ты считаешь нормальным?У мелкософта студия тоже не во всём стандарту соответсвует и что это мешает писать эффективные приложения?А так да компилятор-буквоед будет кричать.
Не по теме: PS:Компилятор - переводчик наших мыслей в язык инструкций, один переводчик понимает нас с полуслова, другой требует чтобы ему ещё попу подтёрли. А итог один. В реальном мире (допустим в политике) все продвинутые мужи предпочитают чтобы их понимали с полуслова, тоже самое касается и программирования (надеюсь мою аллегорию понял).
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
19.04.2012, 12:37 | 13 |
Такой как GCC. Так же считаю такую запись неправильной.
Не по теме: Ушел с 10 студии, так как она даже нормально перегрузить функции неможет.
0
|
Заблокирован
|
||||||
19.04.2012, 14:50 | 14 | |||||
даже и не ставил, пишу в 2008-й и то она геморная, опитимальней всего для меня 6-ка.
codepad да ругается на строку char * str = "qwerty"; http://codepad.org/9xq7aa7L А теперь смотри как это просто решается
второй вариант понятное дело работает норм изначально http://codepad.org/uLhoUq3r
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
||||||
19.04.2012, 15:04 | 15 | |||||
Ну так оно так решается просто, но неправильно. Разве что деваться уже некуда, тогда можно и так. А правильно-то тоже просто
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
19.04.2012, 15:23 | 16 |
0
|
|
19.04.2012, 15:32
#18
|
0
|
1 / 1 / 4
Регистрация: 28.09.2011
Сообщений: 113
|
||||||
20.04.2012, 00:01 | 19 | |||||
Я так понимаю, str хранит просто адрес на char, то по идеи если выводит её как str,а не *str, то она должна вывести просто адрес? cout<<"str : "<<*str<<"\t(adr : "<<&str<<")"<<endl;
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
20.04.2012, 00:11 | 20 |
Компилятор знает, что str указатель из объявления переменной в строке 1. Если бы это был указатель на любой другой тип, кроме char, то вывод cout<<str выдал бы именно адрес. Но указатель на char интерпретируется особым образом и выводится именно содержимое строки, то есть цепочка символов, начиная с данного адреса и до первого нуля. cout<<*str должен вывести только первый символ строки, потому что *str имеет тип одиночного символа char.
1
|
20.04.2012, 00:11 | |
20.04.2012, 00:11 | |
Помогаю со студенческими работами здесь
20
Однонаправленные списки. [Error] incompatible types in assignment of 'char*' to 'char [128]' Проблема с несовместимостью типов параметров char, const char, STRSAFE_LPWSTR, STRSAFE_LPCWSTR Как присвоить к новой char переменной другую char переменную с указателем Ошибка в cannot convert char * to char вроде поправил теперь выводит ересь( Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |