![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| MAKCim |
|
||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
Блин, ну открой K&R и посмотри Вся фишка в том, что если два понятия можно использовать схожим образом - это еще не значит что это одно и то же Массив - это последовательность элементов одного типа (располагаются в памяти друг за другом) Указатель - переменная, содержащая виртуальный адрес какого-то объекта Касаясь отличий, да возьмем хотя-бы такой пример
Хотя бы это показывает, что char* и char[] - разные понятия Добавлено @ 14:10
Первое неправильно, второе правильно p[i][j] ~ *(*(p+i)+j); но char** p = array неправильно синтаксически если array это char[2][2] к примеру, т к разные типы можно конечно с помощью (char**) или в С++ с помощью reinterpret_cast<char**> привести но зачем? -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||
|
|||||||
| SergeCpp |
|
||||||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: 15 Всего: 124 |
...из книги Сергея Деревяго C++ 3rd: комментарии
Встроенные в C++ типы низкого уровня, такие как указатели и массивы, имеют соответствующие операции, поэтому мы можем записать:
Ну, если к делу подойти формально, то записать мы так не можем. Вот что говорит об этом д-р Страуструп:
Так в чем же нарушается эквивалентность? По стандарту C++ мы имеем следующие эквивалентные преобразования: &vc1[200] -> &(*((vc1)+(200))) -> &*(vc1+200) Действительно ли равенство &*(vc1+200) == vc1+200 неверно?
Спешу вас успокоить, что на практике в выражении &*(vc1+200) некорректное разыменование *(vc1+200) практически никогда не произойдет, т.к. результатом всего выражения является адрес и ни один серьезный компилятор не станет выбирать значение по некоторому адресу (операция разыменования) чтобы потом получить тот же самый адрес с помощью операции &. |
||||||
|
|||||||
| likehood |
|
|||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
||||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
т.е int y(char[]) это то же, что и int x(char*) ? (я уже про многомерные не говорю) при вызове y массив скопируется в стек полностью, при вызове x скопируется только указатель на него. |
|||
|
||||
| Romikgy |
|
||||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 8 Всего: 146 |
еще вопросы Добавлено @ 15:24 Давайте народ определимся о каких вещах мы говорим, об объявлении переменых , или об передаче переменых в ф_цию? -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
||||
|
|||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Перестаньте приводить ассемблерские кода. Это не доказательство никакое!!!
Они разные получаются в зависимости от оптимизатора и конкретного компилера. Если у задачи существует оптимальное решение и оптимизатор его знает, то он любой код, приводящий это решение, скомпилит в одинаковый машинный код. Это не значит, что измени условие задачи, вывод останется тем же.!! Зачем там memset, если место ты уже [] выделил? |
|||
|
||||
| MAKCim |
|
||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
В любом случае char* - char[], так же как и char** - char[][] - разные понятия При вызове функции в стек копируется адрес первого элемента массива Т. е компилятор сам осуществляет преобразование, массива в адрес первого элемента, создавая впечатление эквивалентности этих понятий (указателя и массива). Но они не эквивалентны как не крути - массив - это массив, переменная - это переменная! Добавлено @ 15:32
В стеке переменные по-умолчанию не инициализируются 0
Здесь я бы не спорил, т. к если в сигнатуре функции мы пишем int a[20]/[], то передается все равно указатель -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||
|
|||||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
А зачем так писать, если не инициализируешь? написал бы второй строкой sx[0]='s'. Выделять память там полюбому не надо. |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 8 Всего: 146 |
мемсет у мя обнуляет выделеную память Добавлено @ 15:49 а куда тогда писать? мы выделяем память или в хипе динамически, или в стеке если массивом -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Зачем? Но это к делу отношения не имеет.. Естесственно компилер любой код приведёт к указателям и числам. Как и классы ООП, массивы являются лишь обёрткой следующего уровня. Добавлено @ 15:52 чар[20] - ты уже этим память выделил. Туда и писать. |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 8 Всего: 146 |
да но посмотри что в этих чарах лежит сразу после выделения дык а кто юзает код проги , компиляторы -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Какайя разница, что там лежит? Мусор какой нибудь. Добавлено @ 16:11 Убери мемсет из кода. Ничего не изменится. |
|||
|
||||
| likehood |
|
|||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
да а я про них тоже не говорил в том то и дело что нет, т.к. в большинстве случаев это не требуется, а память жалко
все таки массив - это структура данных в памяти, она никуда не преобразовывается. Просто когда мы передаем массив в функцию всегда передается его адрес, сама же функция не может определить чем был исходный массив: обычным статическим масивом или указателем, ссылающимся на динамич. массив. В этом смысле при передаче одномерного массива разницы между массивами и указателями нет. p.s. с многомерными массивами все не так просто |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 8 Всего: 146 |
согласен , но имхо лучше когда обнуляешь -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
я немного не так выразился -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |