![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 8 Всего: 146 |
может , но рабочий объясни плз в чем разница! -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Рабочий он, но только с одномерным массивом, потому что реализачия действительно на большинстве компилеров почти одинакова. На примере многомерного попробую обьяснить. Как мы знаем, многомерный массив после аллокации и инициализации будет выглядеть так: char **x=new char *[5]; for(int i=0;i<5;i++) { x[i]=randomstring();//предположим, эта функция возвращает char* } [0]->['3456345'] [1]->['1234'] [2]->['etzertz'] [3]->['78904567'] [4]->['7890789'] А если определить char y[5][10]; То выделен на весь массив будет один участок памяти. (одномерный массив) [0,1,2,3,4,5,6,..50] при этом если обращаемся к динамическому х х[2][3], то берётся третья буква второго элемента, а если обращаемся к "статическому" y y[2][3], то index элемента в массиве будет вырешан. например 2*5+3; При этом каждый компилер может это делать по разному. Как именно, стандартом не определено. Вполне возможно, что "статический" не будет отличатся от динамического, но в принципе компилер может делать из [] любую структуру. Поэтому после "преобразования" одного типа массива в другой, ошибки при доступе неизбежны. char **c=(char**)y; Такого например уже хороший компилер сделать не даст, но компилер всегда можно обмануть (как ты и сделал). С одномерными, как я уже сказал, проще, но лучше не привыкать к таким вещам. |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 8 Всего: 146 |
sergejzr, я ниче не понял
имхо это не правомерно т.к. это дин. массив чаров, а ты туда указатель на чар имхо я не обманывал , а преобразовал к нужному типу. этого я вообще не понял, имхо все массивы в памяти преобразуются в одномерный массив, а уж динамика это или статика имхо для проги все равно , разница где это размещается, имхо -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 8 Всего: 146 |
да не спорю char s[] и char *s[] это разные вещи, но это понять не могу
мне не понятна в чем разница между char** и char [][] я имею ввиду для дальнейшего использования , ане для инициализации? -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Сейчас, разделю темку, а то оффтоп пошёл
ПС: Ну представь, функция у тебя void test(char**x){} а ты ей y[][] передал Набросал примерчик. Смотри то, что выделено тире
Так что char*,char**, и char[][] это всё разные вещи и преображать одно к другому можно лишь точно понимая, что ты делаешь. |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 8 Всего: 146 |
вот я ее и посеял имхо не корректное преобразование т.к. при обращении tricky[i][z] мы должны знать размерность массива , а при передаче tricky=(char **)y; мы по минимуму теряем 1 размерность , и я такого нигде не видел, везде где идет передача массива более 1 размерности , тогда делают типа такого tricky[][5] тогда понятно будет проге что у нас массив какая то куча строк и 5 столбцов (ну или наоборот) имхо приобразование как я делал , никакого обмана не несет , а твой пример серьйозно обманывает и компилятор и себя , плюс приводит к неработоспособности проги! -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
char** и char[][] - разные типы - в этом вся разница, другое дело, что их использование тесно переплетается -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 8 Всего: 146 |
MAKCim, давай без пространственных фраз в чем они разные? -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Ты там по живому режешь и просто везёт, что в данном случае реализация char* и char[] совпали. А что если компилятор из char[] вообще свой класс делает у которого оператор[] переложен? Стандарт такое позволяет делать. |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
что значит в чем? char** - двойной указатель на char - указывает на указатель, который содержит адрес char char[][] - тип двумерного массива - нельзя неявно преобразовать к char** может еще указатель и массив одно и то же? Это сообщение отредактировал(а) MAKCim - 28.9.2006, 13:41 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 8 Всего: 146 |
не понял объясни в чем разница между массивами и указателями в си? -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| EvgenZ |
|
|||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: 1 Всего: 11 |
А я думал, что имя массива и есть указатель... И что кому как удобнее тот так и делает (* или [] )
-------------------- <удалено администрацией форума> |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Я же специально во втором посте этой теме это попытался расжевать char ** [0]->['3456345'] [1]->['1234'] [2]->['etzertz'] [3]->['78904567'] [4]->['7890789'] Для реализации массива 5,10 необходимо 5+5*10=55 байт 5 байт указателей и 50 байт содержимого причём содержимое может частями находится в любом месте RAM. А у char[5][10] всего 50 байт и все лежат массивом подряд. Добавлено @ 13:55 Массив - структурированный участок памяти. Указатель - ячейка памяти.
Массив никуда "указывать" не может. В отличии от указателя, который как раз на массив может также указывать. Я не могу больше обьяснять. Просто не знаю как понятнее сказать.. Знаешь такой класс Vector? В нём тоже есть оператор [] и работает как массив, но Vector это КЛАСС и преобразовать его в массив путём обьявления - приведёт к неопределённым последствиям. |
|||
|
||||
| EvgenZ |
|
|||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: 1 Всего: 11 |
Мне в голову пригшла мысль, т.е. если у меня есть массив [][] , то я могу обращаться к нему с помощью указателей ** , а если он представлен у меня **, то я немогу использовать [][]. Правильно?
-------------------- <удалено администрацией форума> |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Это разные вещи и нельзя ни того, ни другого. В примере кода я показал, как из char** правильно сделать char[][] - копированием при инициализации. И как неправильно - преобразованием (char**);
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |