Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
Ksan
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
1

char *

19.04.2012, 10:48. Просмотров 1261. Ответов 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 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,...

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

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

25
stawerfar
144 / 58 / 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
Ksan
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
19.04.2012, 11:08  [ТС] 3
stawerfar, а не критично то, что память, которая выделялась под них не освобождается после mas+=1, например?
0
stawerfar
144 / 58 / 8
Регистрация: 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 / 4
Регистрация: 02.11.2010
Сообщений: 370
19.04.2012, 11:44  [ТС] 5
stawerfar, кстати, помню, читал литературу, там было сказано, что писать так нельзя:

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

Не по теме:

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

0
Toshkarik
1150 / 867 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 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
Эксперт С++
2016 / 1497 / 206
Регистрация: 29.05.2011
Сообщений: 3,118
19.04.2012, 15:04 15
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
А теперь смотри как это просто решается
C++
1
char *str = (char *)"qwerty";
Ну так оно так решается просто, но неправильно. Разве что деваться уже некуда, тогда можно и так. А правильно-то тоже просто
C++
1
const char *str = "qwerty";
Впрочем, это уже было показано.
0
Toshkarik
1150 / 867 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
19.04.2012, 15:23 16
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
char *str = (char *)"qwerty";
В данном случае, насколько мне известно, имеет место UB.
0
diagon
Higher
1937 / 1203 / 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
jvov
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
grizlik78
Эксперт С++
2016 / 1497 / 206
Регистрация: 29.05.2011
Сообщений: 3,118
20.04.2012, 00:11 20
Компилятор знает, что str указатель из объявления переменной в строке 1. Если бы это был указатель на любой другой тип, кроме char, то вывод cout<<str выдал бы именно адрес. Но указатель на char интерпретируется особым образом и выводится именно содержимое строки, то есть цепочка символов, начиная с данного адреса и до первого нуля. cout<<*str должен вывести только первый символ строки, потому что *str имеет тип одиночного символа char.
1
20.04.2012, 00:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.04.2012, 00:11

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

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

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


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

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

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