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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
#1

char * - C++

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

Я правильно понимаю, что

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

Если неправильно понимаю, объясните, что значат эти 2 строчки
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2012, 10:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос char * (C++):

(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const& - C++
astxx::manager::connection::connection(std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; const&amp;, unsigned short); ...

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

Error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *' - C++
error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *' void crpost(const statep &amp;struc1) { ...

Ошибка: initializing argument 2 of `char* fgets(char*, int, FILE*) - C++
Написать программу, которая считывает текст из файла и выводит на экран только строки, содержащие двузначные числа Помогите...

Различное поведение функции которая копирует строки с char* t и char t[] - C++
столкнулся с ситуацией которую не могу объяснить пишем функцию которая копирует одну строку в другую: void strstr(char* t,...

Ошибка: call of overloaded 'strchr(char&, char)' is ambiguous - C++
Здравствуйте, прога почему-то ругается на функцию strchr, вот кусок кода: #include &lt;stdio.h&gt; #include &lt;iostream&gt; #include...

25
stawerfar
141 / 55 / 4
Регистрация: 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
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
19.04.2012, 11:08  [ТС] #3
stawerfar, а не критично то, что память, которая выделялась под них не освобождается после mas+=1, например?
0
stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
19.04.2012, 11:20 #4
Для ясности поясню что в данном случае память выделяется в куче как для простых локальных переменных если вы объявляли данную конструкцию теле какой нибудь функции или метода. Тогда память будет освобождена автоматом после выхода из тела функции,метода или модуля. Если же вы использовали эту конструкцию в глобальной области видимости то память будет освобождена только после окончания программы.

Если же бы вы выделяли бы память динамически ну например вот так
char * mas = new char[20];
strncpy(mas,"qwer",20);

то в этом случае программист обязан следить за своевремменым освобождение памяти, так как после выхода из тела функции или метода класса память не освобождается а становиться не доступной. Это связано с спецификой оператора new. Он возращает указатель на начало участка памяти который свободен и может разместить указанный размер информации. По этому нужно следить за освобождением.
Хотя и это не криично т.к. полсе завершения программы эта память тоже будет освобождена. Утечка памяти опасна в локальных методах особенно если это вызывается очень большое количество раз.
0
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
19.04.2012, 11:44  [ТС] #5
stawerfar, кстати, помню, читал литературу, там было сказано, что писать так нельзя:

C
1
char *chbuff;
Потому что то, как это интерпретирует компилятор зависит только от него.
Однако читая разные примеры, сталкиваюсь с такой записью. Так кто же прав?
0
Nekto
342 / 287 / 10
Регистрация: 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
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
19.04.2012, 12:08 #8
Ksan, в Вашем случае просто объявляется указатель на char. Нельзя делать так как в первом посте. Так как там указатель указывает на строковый литерал, который по своей сути является констатным. По этому указатель должен объявляться как указатель на константные данные.
C
1
const char *a = "some string";
0
stawerfar
141 / 55 / 4
Регистрация: 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
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
19.04.2012, 12:20 #11
-=ЮрА=-, о том, что в первом посте для инициализации использовался строковый литерал, в твоем же примере ты отдельно выделяешь под строки память. При компиляции кода из первого поста нормальный компилятор выдаст предупреждение, о том, что типу char * присваивается const char *.
0
-=ЮрА=-
Заблокирован
Автор FAQ
19.04.2012, 12:30 #12
Цитата Сообщение от Toshkarik Посмотреть сообщение
нормальный компилятор
какой компилятор ты считаешь нормальным?У мелкософта студия тоже не во всём стандарту соответсвует и что это мешает писать эффективные приложения?А так да компилятор-буквоед будет кричать.

Не по теме:

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

0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
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
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
19.04.2012, 15:04 #15
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
А теперь смотри как это просто решается
C++
1
char *str = (char *)"qwerty";
Ну так оно так решается просто, но неправильно. Разве что деваться уже некуда, тогда можно и так. А правильно-то тоже просто
C++
1
const char *str = "qwerty";
Впрочем, это уже было показано.
0
19.04.2012, 15:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2012, 15:04
Привет! Вот еще темы с ответами:

array char* to char* (значения массива указателей в один указатель) - C++
Как сложить(или вывести в формате char*) все значения массива указателей(char *) воедино, то есть сложить строки и назначить результату...

Сделать преобразование unsigned char в char, а затем типу int - C++
Здраствуйте, есть вопрос: Число представлено двумя полями: типа long для рублей и unsigned char - для копеек. Собственно что мне...

функция возвращает массив слов, содержащихся в текстовом сообщении char* Words(char *s) - C++
Стоит такая задача: функция должна возвратить массив слов, содержащихся в текстовом сообщении char* Words(char *s) Как это можно...

Ошибка в работе с файлами: error: incompatible types in assignment of ‘char*’ to ‘char* [255]’ - C++
Суть задания Есть файл допустим 1.txt нужно выполнить обработку этого файла а результат вывести в этот же файл с другим расширением ...


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

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

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