| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > [pointer on C] задачи на указатели |
| Автор: cupper 18.9.2010, 12:28 |
| Нужно подтянуть такую сложную тему в программировании как указатели. Сказали есть книжка Pointet on C, но перевода не нашол, а англ не потяну читать. Может быть кто нибудь знает сборники/книги/ресурсы с задачами и просто учебным материалом непосредственно по указателям, не на начальном уровне (как обычно) а чтобы прям мастер класс стать. Потому что как таковых задач не стоит щас на которых можно тренироваться, а выдумывать самому, так ничему не научусь ибо не выдумаю действительно сложные задачи. Заранее спасибо. |
| Автор: djamshud 18.9.2010, 12:42 |
| K&R. В православном переводе тоже есть. |
| Автор: cupper 18.9.2010, 14:40 | ||
эта книга обо всем |
| Автор: Cheloveck 18.9.2010, 15:24 |
| cupper, я как-то хотел, по молодости, написать уроки по C++. Вот держи статью про указатели и ссылки от туда. |
| Автор: cupper 18.9.2010, 15:47 |
| спасибо, в любой книжке по программированию рассказывается про указатели, а я надеялся найти книгу посвященную только указателям |
| Автор: ИванМ 19.9.2010, 00:04 |
Указатели не составляют большого объема от всего си. И не являются особо сложной проблемой, как кажется на первый взгляд. по этому отдельных книг по этому вопросу не найдешь. Мой совет - попробуй начать с того, что есть, а потом просто задавай вопросы на этом форуме, если что-то не ясно. Проблема не сложная, разберешься. |
| Автор: hente 19.9.2010, 09:17 |
| Джефф Элджер - Библиотека программиста! Если осилишь ВСЕ будешь просто гуру кодер в С++ )) в этой книге найдешьвсе идеомы с указателями используемые в С++ |
| Автор: cupper 19.9.2010, 10:27 | ||
судя по описание отличная книга, да и всего 320 страниц, это не так и много, по сравнение хотя бы со Страуструпом. Спасибо, будет следующая после K&R в прочтении. |
| Автор: cupper 27.9.2010, 23:08 | ||
| дошел я значит к K&R до указателей, и до двумерных массивов, и опять наступаю на одни и теже грабли и из книги ничего не почерпнул для того чот бы понимать где эти грабли лежат и как они работают вот пример: не могу понять что неправильно в этом объявлении
надеюсь что хотя бы с вашей помощью я смогу освоить сложную работу с указателями |
| Автор: Crafty 27.9.2010, 23:33 | ||||
cupper, вы создаете массив из указателей на char и инициализируете их целыми числами. И еще если вы делаете n - мерный массив, то нужно указывать все его размерности, кроме первой явно.
Вот так будет выглядеть указатель на 2-мерный массив 2x3, если вы это имели ввиду:
|
| Автор: Леопольд 28.9.2010, 08:04 |
| Сомневаюсь... |
| Автор: cupper 28.9.2010, 09:47 | ||||||||||||||
нет. Я отталкивался от этого определения
массив указателей на char. строка вида "aaa" есть ничто иное как {'a','a','a','\0'}, в свою очередь каждый символ из этого массива есть ни что иное как однобайтовое число которой можно привести к int. Ну вот я и решил а что б собсно не сделать так как сделал я. И тут я видимо все перепутал. Выше приведенный массив я понимаю как двумерный с переменным числом элементов в каждой строке, как раз благодаря указателям. С числами видимо такое не канает. И нет иного способа как явно определять сначало
а потом пробегать каждый элемент и делать
Но это же равносильно тому чтобы сделать
Тобишь я хотел статически определить двумерный массив с переменным числом элементов в каждой строке. Но да я както пропустил тот момент что к первому массиву обращаться можно только так NAME[i] получаем всю строку (адрес первого элемента строки которой храниться в NAME). Ей богу не понимаю где я ошибаюсь :( Основательно запутался я. |
| Автор: cupper 28.9.2010, 22:02 | ||||||
вот пример
вывод: 2 6 вот так работает и так все понятно. А вот если пробовать делать
так массива не инициализаруется как предполагалось (могу предположить что из за того что в mas[] кладется не адрес массивов {1, 2, 3,4} и их элементы) но для
так работает. Может кто нить объяснить в чем разница ? И возможно объявить не динамический двумерный массив с переменным числом элементов в строках не типа char* ??? Заранее благодарю за обширный ответ |
| Автор: Crafty 29.9.2010, 09:24 | ||||
| cupper, мне кажется вы не видите разницу между массивом символов и указателем на символьную константу. Почитайте K&R повнимательней. K&R:
|
| Автор: cupper 29.9.2010, 14:31 | ||||||
| спасибо что уделяете мне время, но нам нужно уточнить не которые вещи, а то толи мы говорим с вами о разном толи я вас очен сильно не понимаю. Я понимаю разнице между массивом и указателем на массив.
Здесь объявлен массив указателей на строки, что можно понимать как двумерный массив. Запись вида "test" это сокращенная запись {'t', 'e', 's', 't', '\0'} по крайней мере в тоже K&R так написано для случай инициализации одномерного массива
Из чего у меня и сложилось выше написанное заключение что "test" = {'t', 'e', 's', 't', '\0'} Но в случае с указателями "test" != {'t', 'e', 's', 't', '\0'}, потому что
что меня приводит в замешательство. Все что выше написано в теме сводиться к этой проблеме. |
| Автор: Earnest 29.9.2010, 15:17 | ||
Вовсе нет, это совершенно разные вещи. Двумерный массив - это массив, элементами которого являются массивы, причем фиксированной длины. И память эта непрерывна, чего нельзя сказать о массиве указателей. |
| Автор: cupper 29.9.2010, 15:23 | ||||||||
| чем массив символов отличается от массива чисел ? (кроме типов элементов char и int) чем указатель на что либо отличается от указателя на символьную константу ?(кроме того что указательно на символьную константу знает что он указывает на символьную константу) чем символьная константа отличается от константного массива типа char ? (кроме формы объявления) Ответ: ничем. Так в чем разница между тем что сказал я и тем что повторяете вы ? Что такое двумерный массив ? Это массив массивов, тогда чем массив указателей на строки (символьные константы если вам так приятней) отличается от массива int mas[3][4] ? Только тем что последний в памяти храниться последовательно строка за строкой (таким образом к любому элементу массива можно обращаться так *(mas+3*i+j), а char *mas[] = {"aaa", "bbb"}, храниться в разброс (но при этом к любому их его элементов можно обращаться также как и в предыдущем случае mas[i][j] (в случае с указателями *((*(mas+i))+j) из за того что он храниться не в виде последовательности строк) Если вам (может оно и вправду тольк так) приятно называть *mas[] именно только как массив указателей на символьные константы, и ни в коем случае ни двумерный массив (или масив указателей на строки), то давайте называть его так, а то уже второй пост мы спорим о том как я его называю, обходя непосредственно ту проблему на которой сконцентрирован весь топик).
хорошо, не правильно терминологию использовал. PS. тогда остается только один вопрос
и сори за бессмысленный треп. |
| Автор: Master01 29.9.2010, 20:05 |
| вот что написано в "Язык Программирования С++. Спецальное издание." Б. Страуструп. Глава 5.2.2 "Строковые литералы." "... Строковый литерал можно присвоить переменной типа char*. Это разрешается потому что в предыдущих определениях С и С++ типом строкового литерала был char*. Благодаря такому разрешению миллионы строк кода на С и С++ остаются синтаксически корректными...." строковый литерал - это ваш "test" из предыдущего сообщения. Выходит, что это очередной special case для обеспечения обратной совместимости. Насколько я понял, ошибка в рассуждениях выше в том, что вы считали строковый литерал некой сокращённой формой записи для массивов. Хотя это формально и так, но распространяется только на char, и как справедливо было установленно, к числовым массивам не применимо. Добавлено через 5 минут и 46 секунд это я к тому, что запись char *mas[] есть массив указателей на char, каждому из которых присваивается сроковый литерал. |
| Автор: cupper 30.9.2010, 12:29 | ||
Спасибо, я примерно так и думал, хотелось чтоб ктонибудь подтвердил мои догадки. |