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

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

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

char * - C++

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

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

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

Если неправильно понимаю, объясните, что значат эти 2 строчки
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2012, 10:48     char *
Посмотрите здесь:

В чем разница между char* и char[]? - C++
Доброго времени суток, наткнулся на одну загвоздку есть такой кусок кода int _tmain(int argc, _TCHAR* argv) { char *a =...

Массив char в переменную char - C++
Допустим, имеется заполненный массив char Massiv, и есть переменная char buff. Как массив передать в переменную?

E2034 Cannot convert 'char' to 'char *' - C++
Добрый день всем! Помогите плз исправить ошибку. Не понимаю чего она происходит. Вообщем, нужно все елементы строки text запихнуть в...

Как перевести из char** в char*? - C++
Первый символ каждой строчки char** нужно проверить на условие, как это сделать? Наверное всё очень просто, но ответ на форуме и за его...

В чем отличие char* s от char *s - C++
В чем отличие char* str; от char *str; ?

Преобразование char[256] в char* - C++
Как преобразовать char в char*?

conversion from ‘char’ to ‘const char*’ - C++
Всем добрый вечер! Я хочу выполнить команду is.open(file_name, ios::binary); но функция open требует тип const char file_name, а...

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

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

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

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

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

Не по теме:

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

Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
19.04.2012, 12:37     char * #13
Такой как GCC. Так же считаю такую запись неправильной.

Не по теме:

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

-=ЮрА=-
Заблокирован
Автор FAQ
19.04.2012, 14:50     char * #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
grizlik78
Эксперт С++
1903 / 1435 / 109
Регистрация: 29.05.2011
Сообщений: 2,990
19.04.2012, 15:04     char * #15
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
А теперь смотри как это просто решается
C++
1
char *str = (char *)"qwerty";
Ну так оно так решается просто, но неправильно. Разве что деваться уже некуда, тогда можно и так. А правильно-то тоже просто
C++
1
const char *str = "qwerty";
Впрочем, это уже было показано.
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
19.04.2012, 15:23     char * #16
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
char *str = (char *)"qwerty";
В данном случае, насколько мне известно, имеет место UB.
diagon
Higher
1927 / 1193 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
19.04.2012, 15:24     char * #17
Добавлю, что q и w можно получить с помощью chbuff[-2] и chbuff[-1] соответственно.
-=ЮрА=-
19.04.2012, 15:32
  #18

Не по теме:

diagon, где здесь

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

jvov
1 / 1 / 0
Регистрация: 28.09.2011
Сообщений: 113
20.04.2012, 00:01     char * #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;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.04.2012, 00:11     char *
Еще ссылки по теме:

Совместимость char и unsigned char - C++
Есть некие числа в виде unsigned char. Есть строка в виде массива char (которая потом сбрасывается в файл с помощью fputs). В программе...

Копирование char* в массив char[i]* - C++
Друзья, не бейте, искал, то что нашел - не помогло. Использую WinAPI, но это не суть важно сейчас. Весь код под спойлером у меня есть...

Unsigned char * в char * и наоборот - C++
Здравствуйте!помогите перевести unsigned char * в char * и наоборот без использования printf

Невозможно преобразовать char* в char - C++
Как исправить ошибку?

Char *(UTF-8) -> char *(ANSI) - C++
Есть строка в кодировке UTF-8(если не ошибаюсь) типа char * Вот так ее я вижу в MSVC++10 - комментарии(оригинал - комментарии)...


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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт С++
1903 / 1435 / 109
Регистрация: 29.05.2011
Сообщений: 2,990
20.04.2012, 00:11     char * #20
Компилятор знает, что str указатель из объявления переменной в строке 1. Если бы это был указатель на любой другой тип, кроме char, то вывод cout<<str выдал бы именно адрес. Но указатель на char интерпретируется особым образом и выводится именно содержимое строки, то есть цепочка символов, начиная с данного адреса и до первого нуля. cout<<*str должен вывести только первый символ строки, потому что *str имеет тип одиночного символа char.
Yandex
Объявления
20.04.2012, 00:11     char *
Ответ Создать тему
Опции темы

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