Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разница между масивом и вектором 
:(
    Опции темы
admsasha
Дата 18.1.2007, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: 1
Всего: 6



Объясните пожалуйста, все разница между
char a[10];
и
char* a;


В чем их отличия и чем приимущества... перечитал несколько статей, но так и не понял чем же пользоваться в какой ситуации...


Очень прошу вас помочь, так как совсем запутался...  smile   smile 
PM MAIL WWW ICQ Jabber   Вверх
powerfox
Дата 18.1.2007, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 5
Всего: 97



admsasha, разница во всём.

Цитата(admsasha @  18.1.2007,  15:20 Найти цитируемый пост)
char a[10];

Массив с 10-ю элементами типа char.

Цитата(admsasha @  18.1.2007,  15:20 Найти цитируемый пост)
char* a;

Указатель на char.

Вот пример:
Код

char a[10];
char *pointer = a; //pointer указывает на a[0];
cout<<*(pointer++); //сначала pointer становится указателем на а[1], а потом выводится a[0]
some_func(pointer); //функции передаётся указатель, а не весь массив, что намного быстрее во многих случаях и экономит память.


Добавлено @ 14:32 
А вообще, это есть в любой книге по С/С++, причём в самом начале.

Добавлено @ 14:33 
admsasha, у меня в свою очередь 2 вопроса: 
при чём здесь вектор?
при чём здесь C/C++: Программирование под Unix/Linux?


--------------------
user posted image
PM WWW   Вверх
admsasha
Дата 18.1.2007, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: 1
Всего: 6



Цитата(powerfox @  18.1.2007,  21:27 Найти цитируемый пост)

А вообще, это есть в любой книге по С/С++, причём в самом начале.

Да, есть.... но чего то я не понял нечего... точнее запутался...  smile 


Цитата(powerfox @  18.1.2007,  21:27 Найти цитируемый пост)
при чём здесь вектор?
 Опечатался, вот только что хотел поменять название... но раз ответили уже... 


Цитата(powerfox @  18.1.2007,  21:27 Найти цитируемый пост)
при чём здесь C/C++: Программирование под Unix/Linux? 
  На всякий случай...


Это сообщение отредактировал(а) admsasha - 18.1.2007, 14:44
PM MAIL WWW ICQ Jabber   Вверх
bilbobagginz
Дата 18.1.2007, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 4
Всего: 317



Код

char a1[10];
//в результате предыдущего выражения, появится переменная a, и аллоцируется кусок из 10 единиц типа char с неизвестным "наполнителем"
char* a2;
// в результате этого выражения появится переменная типа "указатель на char", неинициализированная.
// в C - это один и тот же тип данных, поэтому можно после написать:
a2=a1;



1-й случай используется когда ты знаешь какой кусок памяти тебе понадобится до запуска программы.
2-й случай - когда аллокация происходит динамически, или когда изпользуется уже аллоцированный адрес.


в первом случае всегда a1 указывает на валидный регион памяти, с неизвестными значениями.
во втором a2 может держать значение невалидного адреса, и при обращении по этому адресу произойдёт ошибка доступа к памяти
  •  на юникс - программа может получить сигнал SIGSEGV ( segment violation )
  •  на виндовс - выскочит ошибка "Access Valiolation" или что-то с Invalid memory
для избежания использования такого указателя надо его инициализировать хотя бы на NULL, и позже проверять на это.



пока.






--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
admsasha
Дата 18.1.2007, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: 1
Всего: 6



bilbobagginz, если я получаю строку из какого то ввода, из файла и т.д. т.е. точную длину незнаю, то в этом случае лучше всего использовать "указатель на char" ?
PM MAIL WWW ICQ Jabber   Вверх
powerfox
Дата 18.1.2007, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 5
Всего: 97



admsasha, кничи тебе в помощь.


Цитата(admsasha @  18.1.2007,  15:54 Найти цитируемый пост)
bilbobagginz, если я получаю строку из какого то ввода, из файла и т.д. т.е. точную длину незнаю, то в этом случае лучше всего использовать "указатель на char" ?

Строки в Си ограничены нулём. Поэтому ты спокойно можешь найти её конец.

a) Ты читаешь с ввода посимвольно: читай пока не встретишь конец строки.

б) Получаешь сразу строку с помощью библиотечно функции. Вызови strlen и получишь длину строки.


--------------------
user posted image
PM WWW   Вверх
admsasha
Дата 18.1.2007, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: 1
Всего: 6



powerfox, Вопрос заключался не как это сделать,а в правильности выбора...

Это сообщение отредактировал(а) admsasha - 18.1.2007, 15:18
PM MAIL WWW ICQ Jabber   Вверх
powerfox
Дата 18.1.2007, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 5
Всего: 97



Цитата(admsasha @  18.1.2007,  16:18 Найти цитируемый пост)
powerfox, Вопрос заключался не как это сделать,а в правильности выбора...

 smile 
Выбор зависит от того, как ты получаешь строку ))


--------------------
user posted image
PM WWW   Вверх
admsasha
Дата 18.1.2007, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: 1
Всего: 6



Цитата(powerfox @  18.1.2007,  22:31 Найти цитируемый пост)
Выбор зависит от того, как ты получаешь строку )) 


код может быть не совсем грамотный... 
Код

    fp = fopen(Config_FILE, "r");
    while(fgets(line, 1024, fp) !=NULL){
      // тут что-то должно быть
    }
    fclose(fp);


например так ?
PM MAIL WWW ICQ Jabber   Вверх
powerfox
Дата 18.1.2007, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 5
Всего: 97



admsasha, да.


--------------------
user posted image
PM WWW   Вверх
admsasha
Дата 18.1.2007, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: 1
Всего: 6



powerfox,  char* line ?
PM MAIL WWW ICQ Jabber   Вверх
powerfox
Дата 18.1.2007, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 5
Всего: 97



Учитывая объявление функции, то да. Но и char line[N] тоже должно работать, так как при вызове функции будет неявное преобразование в char*.


--------------------
user posted image
PM WWW   Вверх
admsasha
Дата 18.1.2007, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: 1
Всего: 6



Еще есть какое то
std::string s = "something";

это что ?

Добавлено @ 16:40 
Сравнение,вырезка, определение длины, это уже будут другие функции ? strcmp,strlen и.д. уже не подходят...   smile 
PM MAIL WWW ICQ Jabber   Вверх
powerfox
Дата 18.1.2007, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 5
Всего: 97



Цитата(admsasha @  18.1.2007,  17:37 Найти цитируемый пост)
Еще есть какое тоstd::string s = "something";

Книгу по С++ тебе в руки.


--------------------
user posted image
PM WWW   Вверх
MAKCim
Дата 18.1.2007, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата

powerfox,  char* line ? 

нет, если ты память не динамически выделяешь (посредством malloc/calloc,...)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.1518 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.