![]() |
|
Модераторы: xvr |
![]()
|
|
| admsasha |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: 1 Всего: 6 |
Объясните пожалуйста, все разница между
char a[10]; и char* a; В чем их отличия и чем приимущества... перечитал несколько статей, но так и не понял чем же пользоваться в какой ситуации... Очень прошу вас помочь, так как совсем запутался... |
|||
|
||||
| powerfox |
|
|||
![]() I wanna fork() ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3990 Регистрация: 1.10.2005 Где: Санкт-Петербург Репутация: 5 Всего: 97 |
admsasha, разница во всём.
Массив с 10-ю элементами типа char. Указатель на char. Вот пример:
Добавлено @ 14:32 А вообще, это есть в любой книге по С/С++, причём в самом начале. Добавлено @ 14:33 admsasha, у меня в свою очередь 2 вопроса: при чём здесь вектор? при чём здесь C/C++: Программирование под Unix/Linux? |
|||
|
||||
| admsasha |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: 1 Всего: 6 |
Да, есть.... но чего то я не понял нечего... точнее запутался... Опечатался, вот только что хотел поменять название... но раз ответили уже... На всякий случай... Это сообщение отредактировал(а) admsasha - 18.1.2007, 14:44 |
|||
|
||||
| bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 4 Всего: 317 |
1-й случай используется когда ты знаешь какой кусок памяти тебе понадобится до запуска программы. 2-й случай - когда аллокация происходит динамически, или когда изпользуется уже аллоцированный адрес. в первом случае всегда a1 указывает на валидный регион памяти, с неизвестными значениями. во втором a2 может держать значение невалидного адреса, и при обращении по этому адресу произойдёт ошибка доступа к памяти
пока. -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
| admsasha |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: 1 Всего: 6 |
bilbobagginz, если я получаю строку из какого то ввода, из файла и т.д. т.е. точную длину незнаю, то в этом случае лучше всего использовать "указатель на char" ?
|
|||
|
||||
| powerfox |
|
|||
![]() I wanna fork() ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3990 Регистрация: 1.10.2005 Где: Санкт-Петербург Репутация: 5 Всего: 97 |
admsasha, кничи тебе в помощь.
Строки в Си ограничены нулём. Поэтому ты спокойно можешь найти её конец. a) Ты читаешь с ввода посимвольно: читай пока не встретишь конец строки. б) Получаешь сразу строку с помощью библиотечно функции. Вызови strlen и получишь длину строки. |
|||
|
||||
| admsasha |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: 1 Всего: 6 |
powerfox, Вопрос заключался не как это сделать,а в правильности выбора...
Это сообщение отредактировал(а) admsasha - 18.1.2007, 15:18 |
|||
|
||||
| powerfox |
|
|||
![]() I wanna fork() ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3990 Регистрация: 1.10.2005 Где: Санкт-Петербург Репутация: 5 Всего: 97 |
||||
|
||||
| admsasha |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: 1 Всего: 6 |
||||
|
||||
| powerfox |
|
|||
![]() I wanna fork() ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3990 Регистрация: 1.10.2005 Где: Санкт-Петербург Репутация: 5 Всего: 97 |
admsasha, да.
|
|||
|
||||
| admsasha |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: 1 Всего: 6 |
powerfox, char* line ?
|
|||
|
||||
| powerfox |
|
|||
![]() I wanna fork() ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3990 Регистрация: 1.10.2005 Где: Санкт-Петербург Репутация: 5 Всего: 97 |
Учитывая объявление функции, то да. Но и char line[N] тоже должно работать, так как при вызове функции будет неявное преобразование в char*.
|
|||
|
||||
| admsasha |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: 1 Всего: 6 |
Еще есть какое то
std::string s = "something"; это что ? Добавлено @ 16:40 Сравнение,вырезка, определение длины, это уже будут другие функции ? strcmp,strlen и.д. уже не подходят... |
|||
|
||||
| powerfox |
|
|||
![]() I wanna fork() ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3990 Регистрация: 1.10.2005 Где: Санкт-Петербург Репутация: 5 Всего: 97 |
Книгу по С++ тебе в руки. |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
нет, если ты память не динамически выделяешь (посредством malloc/calloc,...) -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 4 Всего: 317 |
не факт. на это полагаться никак нельзя. Нужно считывать кусочками, ессно величина кусочка (а др. словами кол-во вызовов read(), fgets() и т.п. ) зависит от задачи. а насчёт std::string саша, пойми: только в Си char* примерно то же, что и char [] с т.з. реализации и занимаемого пространства (места). в Си++ там всё по-другому. -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| kirjanov |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 22.1.2006 Где: Dark wood of erro r Репутация: 3 Всего: 15 |
вроде в C++ строка является объктом
|
|||
|
||||
| bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 4 Всего: 317 |
MAKCim,
я советую почитать Б.Страуструпа. в Си++ классах есть много добавок ( относительно struct в Си ), напр vfptr, vbptr и т.д. и т.п. посмотри раздел: Technicalities, Section B ( compatibility ) пока. -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
| MAKCim |
|
||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
см. выделенное char* и char[] в С++ по-другому реализуются? уточнять надо, что речь о классах идет... Добавлено @ 20:39
опять уточнять надо, что имеется в виду: строка литералов ("bla-bla-bla") или объект класса строки (std :: string) Это сообщение отредактировал(а) MAKCim - 19.1.2007, 20:37 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||
|
|||||||
| admsasha |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: 1 Всего: 6 |
Вот допустим я создаю
char* a; как сделать strcat(a,"123"); strcat(a,"345"); и как применить форматированый вывод ? ? |
|||
|
||||
| bilbobagginz |
|
||||||||||||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 4 Всего: 317 |
как сделать
и как применить форматированый вывод ? ответ: переменная-указатель - это как почтовый ящик. если он пустой, то он ничего с т.з. почты не значит, но с указателями ещё хуже: если его не "инициализировали", он может указывать либо на какой-то ненужный и неправильный (но валидный) адрес с какими-то нерелевантными данными, которые ты можешь принять за нужные, и напр. переписать той же командой:
какую-то другую переменную, либо, он может указывать на какой-то невалидный адрес, и обратившись к нему ты получаешь ошибку в доступе к памяти ( SIGSEGV ), и программа вылетает. как решить ? если ты используешь "просто-указатель", то указывать им ты должен либо на регион, который ты сам (напр. тут-же) аллоцируешь ( выделяешь ):
или же ты указываешь своим указателем на какой-то другой, валидный и правильный регион:
и если обозначим неизвестно что значком "*", то в str будет:
загвоздка в том, что если ты в программе делаешь malloc(), то где-то надо освобождать это место при помощи free(). можно не освобождать, когда аллокация делается точное ограниченное число раз, тогда выходить надо с помощью exit(0); судя по вопросам, тебе надо сначала прочитать книжку Б.Кернигана и Д.Ричи. пока -------------------- Я ещё не демон. Я только учусь. |
||||||||||||
|
|||||||||||||
| admsasha |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: 1 Всего: 6 |
bilbobagginz, после твоего ответа теперь понял, что я вообще неправильно понимал, на счет char*, я пологал что это значит что могу пихать туда неограничено объема, а char[10] только 10знаков.
|
|||
|
||||
| bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 4 Всего: 317 |
это уже смотря куда ты им будешь указывать. Есть ещё один пример с использованием указателей - в общих вопросах была тема с удалением лишних пробелов, где Dov показал человеку элементарную арифметику указателей. всё-таки книга "Язык программирования Си" от авторов Брайан Керниган, Денис Ричи, т.н. "Библия Си" - хорошая и полезная книга: полный справочник и есть примеры, показывающие всё что стоит. И вообще пройдёт 5 лет после твоего последнего проекта на Си, перейдёшь ты на Си++ или другой язык - очень полезно, чтобы материал был под рукой. То же относится и к "Язык программирования Си++" от Бьярна Страуструпа ( бери самое последнее издание) а также в последствии ( если на Си++ перейдёшь ), то приобрети "Шаблоны Планирования" ( Design Patterns ) пока. -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
| powerfox |
|
|||
![]() I wanna fork() ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3990 Регистрация: 1.10.2005 Где: Санкт-Петербург Репутация: 5 Всего: 97 |
bilbobagginz, единственно, если бы 1 строка создавалась и удалялась через new и delete |
|||
|
||||
| admsasha |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: 1 Всего: 6 |
||||
|
||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |