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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> &array[ 0 ] vs. array 
:(
    Опции темы
semibug
Дата 18.11.2011, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Если некоторая функция принимает указатель на char, например:
Код

void foo( char* data );

то имея массив объявленный как
Код

char array[ 42 ];

можно вызвать функцию foo так:
Код

foo( arrray );

либо так:
Код

foo( &arrray[ 0 ] );

Причем второй способ встречался чаще. Есть ли разница в этих двух способах вызова функции?

PM   Вверх
borisbn
Дата 18.11.2011, 21:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Голосую за второй вариант- можно потом заменить тип array на vector или string без изменения твоего кода


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
ecspertiza
Дата 18.11.2011, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



мне тоже стало интересно почему эти варианты идентичны ? я второй понял бы как передача ссылки на первый элемент массива, но вроде как передается весь массив


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
borisbn
Дата 18.11.2011, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(ecspertiza @  18.11.2011,  21:44 Найти цитируемый пост)
но вроде как передается весь массив

если смотреть со стороны ф-ции
Цитата(semibug @  18.11.2011,  19:50 Найти цитируемый пост)
void foo( char* data );

то передаётся, все-таки, указатель на начало массива


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 19.11.2011, 02:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(borisbn @  18.11.2011,  20:14 Найти цитируемый пост)
Голосую за второй вариант- можно потом заменить тип array на vector или string без изменения твоего кода 

смелое однако заявление smile 



Это сообщение отредактировал(а) mes - 19.11.2011, 02:42


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 19.11.2011, 04:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(mes @  19.11.2011,  02:42 Найти цитируемый пост)
смелое однако заявление

оператор индекса ведь есть и у вектора и у стринга. или что?
PM WWW   Вверх
borisbn
Дата 19.11.2011, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(mes @  19.11.2011,  02:42 Найти цитируемый пост)
смелое однако заявление

Если Вы имели в виду, что необходимо проверять строку на предмет empty(), то да - изменения потребуются (как, впрочем, и с вектором).
Или, может, Вы имели в виду, что operator[] строки не обязан возвращать указатель на, так сказать, raw-данные строки ?

В общем, хотелось бы комметариев

Это сообщение отредактировал(а) borisbn - 19.11.2011, 09:25


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
newbee
Дата 19.11.2011, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


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

Репутация: 3
Всего: 19



Голосую за первый вариант, потому что второй - напрасное усложнение.


--------------------
You're face to face
With man who sold the world
PM   Вверх
Леопольд
Дата 19.11.2011, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 13



Цитата(borisbn @  19.11.2011,  09:25 Найти цитируемый пост)
operator[] строки не обязан возвращать указатель
operator[] возвращает ссылку на элемент под этим индексом

Цитата(borisbn @  19.11.2011,  09:25 Найти цитируемый пост)
В общем, хотелось бы комметариев
IMHO, всё зависит от реализации контейнера, поэтому второй вариант гарантирует портабельность кода, а первый нет.


Это сообщение отредактировал(а) Леопольд - 19.11.2011, 11:28


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
mes
Дата 19.11.2011, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(borisbn @  19.11.2011,  08:25 Найти цитируемый пост)
 Вы имели в виду, что operator[] строки не обязан возвращать указатель на, так сказать, raw-данные строки ?

 smile

Добавлено через 1 минуту и 23 секунды
Цитата(borisbn @  19.11.2011,  08:25 Найти цитируемый пост)
В общем, хотелось бы комметариев

я хотел дать возможность самим найти ответ на вопрос.. что впрочем Вы исделали smile



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 19.11.2011, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(mes @  19.11.2011,  11:31 Найти цитируемый пост)
 smile 

а разве существуют реализации std::string/std::vector возвращающие не ссылку на элемент?
 smile 
нет, конечно, в Qt`ешных контейнерах это нормально, там и множество не сортированное. но это ничего. все равно никто(почти) из пользователей этого и не заметил.
почти уверен в том, что и borisbn об этом не знал ;)

Это сообщение отредактировал(а) boostcoder - 19.11.2011, 12:07
PM WWW   Вверх
Dem_max
Дата 19.11.2011, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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



да без разницы как сделаешь, лишь бы самому было понятно, но лучше второй вариант, так будет понятней что передаешь указатель массива, а не какую нить переменную (чисто так чтение кода упрощается со вторым вариантом).


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
mes
Дата 19.11.2011, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(boostcoder @  19.11.2011,  11:07 Найти цитируемый пост)
а разве существуют реализации std::string/std::vector возвращающие не ссылку на элемент?

существуют (законы по стандарту) реализации std::string в которых расположение элементов не плоское.. (в отличие от vector`а)..
Это мы еще не впомнили про возможное отсутствие признака конца строки..  

Цитата(boostcoder @  19.11.2011,  11:07 Найти цитируемый пост)
 конечно, в Qt`ешных контейнерах

речь не о них, а о stl..

Добавлено через 2 минуты и 53 секунды
поэтому конструкция типа  &str[ 0 ]  (для std::string) - это путь к длительному и весьма занятному времяпровождению за дебагом smile




--------------------
PM MAIL WWW   Вверх
volatile
Дата 19.11.2011, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(borisbn @  19.11.2011,  09:25 Найти цитируемый пост)
строки не обязан возвращать указатель на, так сказать, raw-данные строки 

Теоретически эти данные могут быть расположены не последовательно в памяти. Мы не знаем какой внутренний механизм у стринга. Чтобы расположить данные последовательно, и завершить их нулем, существует .c_str();

Одна из вещей которая меня всегда удивляет в С++, (как впрочем видимо и в других языках), есть вещи которые работают в реале всегда, но теоретически нарушают некое правило, и тем самым вызвают бурю возражений (одну из этих вы привели).
И есть обратное, когда код прямо не нарушает правило, но в реале, глючит абсолютно везде и абсолютно всегда! (хотя бы тот же самый utf-8). И это почему-то, ни у кого не вызывает бурю эмоций!
 smile 


PM MAIL   Вверх
boostcoder
Дата 19.11.2011, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(mes @  19.11.2011,  12:16 Найти цитируемый пост)
существуют

ну раз Вы говорите...

PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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