Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
1

char *

19.04.2012, 10:48. Показов 1993. Ответов 25
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Я правильно понимаю, что

C
1
2
char *chbuff = "qwerty";
chbuff+= 2;
этот код передвинет указатель на букву 'e'?
что тогда произойдет с q и w?

Если неправильно понимаю, объясните, что значат эти 2 строчки
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.04.2012, 10:48
Ответы с готовыми решениями:

Char unsigned char signed char длинна Кааак
Здравствуйте. char l = {0,0}; l = 0xff; Почему, меня, компилятор не посылает куда...

Ошибка: "char *concat(char *,.)": невозможно преобразовать аргумент 1 из "const char [4]" в "char *"
делал задание, но на строке 36 строке пишет, что "char *concat(char *,...)": невозможно...

(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&
astxx::manager::connection::connection(std::basic_string&lt;char, std::char_traits&lt;char&gt;,...

Error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *'
error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *' void...

25
150 / 64 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
19.04.2012, 11:01 2
Да ты всё верно понимаешь.
Что произайдёт с символами? Да ничего не произойдет. Они будут находиться в том месте где и были изначально. В том пространстве в котором размещается программа. Проверить мои слова ты можешь вот так
C++
1
2
3
4
5
char* mas = "qwer";
mas+=2;
std::cout<<mas<<'='<<"er"<<std::endl;
mas-=2;
std::cout<<mas<<'='<<"qwer"<<std::endl;
0
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
19.04.2012, 11:08  [ТС] 3
stawerfar, а не критично то, что память, которая выделялась под них не освобождается после mas+=1, например?
0
150 / 64 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
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, кстати, помню, читал литературу, там было сказано, что писать так нельзя:

C
1
char *chbuff;
Потому что то, как это интерпретирует компилятор зависит только от него.
Однако читая разные примеры, сталкиваюсь с такой записью. Так кто же прав?
0
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
19.04.2012, 11:47 6
Цитата Сообщение от Ksan Посмотреть сообщение
stawerfar, кстати, помню, читал литературу, там было сказано, что писать так нельзя:

C
1
char *chbuff;
Потому что то, как это интерпретирует компилятор зависит только от него.
Однако читая разные примеры, сталкиваюсь с такой записью. Так кто же прав?
А что в этой записи не так?
0
Заблокирован
Автор FAQ
19.04.2012, 11:56 7
Цитата Сообщение от Ksan Посмотреть сообщение
Я правильно понимаю, что
char *chbuff = "qwerty";
chbuff+= 2;
этот код передвинет указатель на букву 'e'?
что тогда произойдет с q и w?Если неправильно понимаю, объясните, что значат эти 2 строчки
Что такое chbuff += 2; - это сдвиг указателя на 2 символа да строка станет теперь "erty".
Теперь по поводу этого

Цитата Сообщение от Ksan Посмотреть сообщение
stawerfar, а не критично то, что память, которая выделялась под них не освобождается после mas+=1, например?
- нет это заблуждение, строка как была так и будет в памяти. Чтобы было понятно что "строка не страдает от сдвига" предлагаю код ниже
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
 
int main()
{
    char * str = "qwerty";
    char * ptr = str;//Çàïîìíèëè íà÷àëüíûé àäðåñ ñòðîêè
    cout<<"str : "<<str<<"\t(adr : "<<&str<<")"<<endl;
    cout<<"ptr : "<<ptr<<"\t(adr : "<<&ptr<<")"<<endl;
    str += 2;
    cout<<"str : "<<str<<"\t(adr : "<<&str<<")"<<endl;
    cout<<"ptr : "<<ptr<<"\t(adr : "<<&ptr<<")"<<endl;
    system("pause");
    return 0;
}
Отработка
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. Нельзя делать так как в первом посте. Так как там указатель указывает на строковый литерал, который по своей сути является констатным. По этому указатель должен объявляться как указатель на константные данные.
C
1
const char *a = "some string";
0
150 / 64 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
19.04.2012, 12:12 9
-=ЮрА=-, Посмотри пожалуйста личные сообщения!
0
Заблокирован
Автор FAQ
19.04.2012, 12:14 10
Toshkarik, ты вообще о чём
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
 
int main()
{
    char * str = new char[32];
    strcpy(str,"qwerty");
    char * ptr = str;//Çàïîìíèëè íà÷àëüíûé àäðåñ ñòðîêè
    cout<<"str : "<<str<<"\t(adr : "<<&str<<")"<<endl;
    cout<<"ptr : "<<ptr<<"\t(adr : "<<&ptr<<")"<<endl;
    str += 2;
    cout<<"str : "<<str<<"\t(adr : "<<&str<<")"<<endl;
    cout<<"ptr : "<<ptr<<"\t(adr : "<<&ptr<<")"<<endl;
    system("pause");
    return 0;
}
Всё аналогично
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
Заблокирован
Автор FAQ
19.04.2012, 12:30 12
Цитата Сообщение от Toshkarik Посмотреть сообщение
нормальный компилятор
какой компилятор ты считаешь нормальным?У мелкософта студия тоже не во всём стандарту соответсвует и что это мешает писать эффективные приложения?А так да компилятор-буквоед будет кричать.

Не по теме:

PS:Компилятор - переводчик наших мыслей в язык инструкций, один переводчик понимает нас с полуслова, другой требует чтобы ему ещё попу подтёрли. А итог один. В реальном мире (допустим в политике) все продвинутые мужи предпочитают чтобы их понимали с полуслова, тоже самое касается и программирования (надеюсь мою аллегорию понял).

0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
19.04.2012, 12:37 13
Такой как GCC. Так же считаю такую запись неправильной.

Не по теме:

Ушел с 10 студии, так как она даже нормально перегрузить функции неможет.

0
Заблокирован
Автор FAQ
19.04.2012, 14:50 14
Цитата Сообщение от Toshkarik Посмотреть сообщение
Ушел с 10 студии, так как она даже нормально перегрузить функции неможет.
даже и не ставил, пишу в 2008-й и то она геморная, опитимальней всего для меня 6-ка.
codepad да ругается на строку char * str = "qwerty";
http://codepad.org/9xq7aa7L
А теперь смотри как это просто решается
C++
1
char *str = (char *)"qwerty";
http://codepad.org/eDaUSOQm
второй вариант понятное дело работает норм изначально
http://codepad.org/uLhoUq3r
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
19.04.2012, 15:04 15
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
А теперь смотри как это просто решается
C++
1
char *str = (char *)"qwerty";
Ну так оно так решается просто, но неправильно. Разве что деваться уже некуда, тогда можно и так. А правильно-то тоже просто
C++
1
const char *str = "qwerty";
Впрочем, это уже было показано.
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
19.04.2012, 15:23 16
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
char *str = (char *)"qwerty";
В данном случае, насколько мне известно, имеет место UB.
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
19.04.2012, 15:24 17
Добавлю, что q и w можно получить с помощью chbuff[-2] и chbuff[-1] соответственно.
0
-=ЮрА=-
19.04.2012, 15:32
  #18

Не по теме:

diagon, где здесь

Цитата Сообщение от diagon Посмотреть сообщение
Добавлю, что q и w можно получить с помощью chbuff[-2] и chbuff[-1] соответственно.
добавлю что q и w можно получить для момента после того как осуществили
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
str += 2;

0
1 / 1 / 4
Регистрация: 28.09.2011
Сообщений: 113
20.04.2012, 00:01 19
C++
1
2
3
4
5
6
7
8
9
10
char * str = "qwerty";
    char * ptr = str;//Запомнили начальный адрес строки
    cout<<"str : "<<str<<"\t(adr : "<<&str<<")"<<endl;
    cout<<"ptr : "<<ptr<<"\t(adr : "<<&ptr<<")"<<endl;
    str += 2;
    cout<<"str : "<<str<<"\t(adr : "<<&str<<")"<<endl;
    cout<<"ptr : "<<ptr<<"\t(adr : "<<&ptr<<")"<<endl;
    system("pause");
    return 0;
}
cout<<"str : "<<str<<"\t(adr : "<<&str<<")"<<endl; Почему мы выводить без "*" как указатель? Как компилятор знает, что это указатель? Так же легко запутаться, можно подумать что мы выводим целую переменную.
Я так понимаю, 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.04.2012, 00:11
Помогаю со студенческими работами здесь

Однонаправленные списки. [Error] incompatible types in assignment of 'char*' to 'char [128]'
Доброго времени суток. Начал учить однонаправленные списки, но столкнулся с проблемой: ...

Проблема с несовместимостью типов параметров char, const char, STRSAFE_LPWSTR, STRSAFE_LPCWSTR
Проблемные вопросы отражены на скрине Программа написана к заданию: 1. Разработать прикладной...

Как присвоить к новой char переменной другую char переменную с указателем
Как присвоить к новой char переменной другую char переменную с указателем #include&lt;iostream&gt;...

Ошибка в cannot convert char * to char вроде поправил теперь выводит ересь(
Всем доброго дня! У меня такая проблемка.... написал программу, но сначала она ругалась на Cannot...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru