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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [pointer on C] задачи на указатели 
V
    Опции темы
cupper
Дата 18.9.2010, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нужно подтянуть такую сложную тему в программировании как указатели. Сказали есть книжка Pointet on C, но перевода не нашол, а англ не потяну читать. Может быть кто нибудь знает сборники/книги/ресурсы с задачами и просто учебным материалом непосредственно по указателям, не на начальном уровне (как обычно) а чтобы прям мастер класс стать. Потому что как таковых задач не стоит щас на которых можно тренироваться, а выдумывать самому, так ничему не научусь ибо не выдумаю действительно сложные задачи.
Заранее спасибо.
PM MAIL   Вверх
djamshud
Дата 18.9.2010, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



K&R. В православном переводе тоже есть.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
cupper
Дата 18.9.2010, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(djamshud @ 18.9.2010,  12:42)
K&R. В православном переводе тоже есть.

эта книга обо всем 
PM MAIL   Вверх
Cheloveck
Дата 18.9.2010, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



cupper, я как-то хотел, по молодости, написать уроки по C++. Вот держи статью про указатели и ссылки от туда.

Присоединённый файл ( Кол-во скачиваний: 24 )
Присоединённый файл  pointers_and_references_files.zip 19,16 Kb


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


Опытный
**


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

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



спасибо, в любой книжке по программированию рассказывается про указатели, а я надеялся найти книгу посвященную только указателям smile Наверно это глупо, буду опять перечитывать всего по чуть чуть.
PM MAIL   Вверх
ИванМ
Дата 19.9.2010, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(cupper @  18.9.2010,  15:47 Найти цитируемый пост)
я надеялся найти книгу посвященную только указателям

Указатели не составляют большого объема от всего си. И не являются особо сложной проблемой, как кажется на первый взгляд. по этому отдельных книг по этому вопросу не найдешь. Мой совет - попробуй начать с того, что есть, а потом просто задавай вопросы на этом форуме, если что-то не ясно. Проблема не сложная, разберешься.
PM MAIL   Вверх
hente
Дата 19.9.2010, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Джефф Элджер - Библиотека программиста!
Если осилишь ВСЕ будешь просто гуру кодер  в С++ ))
в этой книге найдешьвсе идеомы с указателями используемые в С++
--------------------
  долой быдло кодеров!!!
PM MAIL   Вверх
cupper
Дата 19.9.2010, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(hente @ 19.9.2010,  09:17)
Джефф Элджер - Библиотека программиста!
Если осилишь ВСЕ будешь просто гуру кодер  в С++ ))
в этой книге найдешьвсе идеомы с указателями используемые в С++

судя по описание отличная книга, да и всего 320 страниц, это не так и много, по сравнение хотя бы со Страуструпом. Спасибо, будет следующая после K&R в прочтении.
PM MAIL   Вверх
cupper
Дата 27.9.2010, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



дошел я значит к K&R до указателей, и до двумерных массивов, и опять наступаю на одни и теже грабли и из книги ничего не почерпнул для того чот бы понимать где эти грабли лежат и как они работают
вот пример:
не могу понять что неправильно в этом объявлении
Код

static char *ptempmas[] = {
            {6, 7, 6},
            {9, 10, 11}
};

надеюсь что хотя бы с вашей помощью я смогу освоить сложную работу с указателями

Это сообщение отредактировал(а) cupper - 27.9.2010, 23:09
PM MAIL   Вверх
Crafty
Дата 27.9.2010, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



cupper,  вы создаете массив из указателей на char и инициализируете их целыми числами. И еще если вы делаете n - мерный массив, то нужно указывать все его размерности, кроме первой явно.
Код
 
  char ptempmas[][3] = {
           {6, 7, 6},
           {9, 10, 11}
  };


Вот так будет выглядеть указатель на 2-мерный массив 2x3, если вы это имели ввиду:
Код

static char (*ptempmas)[2][3] ;


Это сообщение отредактировал(а) Crafty - 28.9.2010, 00:05
PM MAIL   Вверх
Леопольд
Дата 28.9.2010, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(hente @  19.9.2010,  09:17 Найти цитируемый пост)
Если осилишь ВСЕ будешь просто гуру кодер  в С++ ))
Сомневаюсь...



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


Опытный
**


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

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



Цитата(Crafty @ 27.9.2010,  23:33)
cupper,  вы создаете массив из указателей на char и инициализируете их целыми числами. И еще если вы делаете n - мерный массив, то нужно указывать все его размерности, кроме первой явно.
Код
 
  char ptempmas[][3] = {
           {6, 7, 6},
           {9, 10, 11}
  };


Вот так будет выглядеть указатель на 2-мерный массив 2x3, если вы это имели ввиду:
Код

static char (*ptempmas)[2][3] ;

нет. Я отталкивался от этого определения
Код

STATIC CHAR *NAME[] = {
    "ILLEGAL MONTH",
    "JANUARY",
    "FEBRUARY",
}

массив указателей на char. строка вида "aaa" есть ничто иное как {'a','a','a','\0'}, в свою очередь каждый символ из этого массива есть ни что иное как однобайтовое число которой можно привести к int.
Ну вот я и решил а что б собсно не сделать так как сделал я. И тут я видимо все перепутал. Выше приведенный массив я понимаю как двумерный с переменным числом элементов в каждой строке, как раз благодаря указателям. С числами видимо такое не канает. И нет иного способа как явно определять сначало
Код

int *mas = new *int[x];

а потом пробегать каждый элемент и делать
Код

mas[i] = new int[y];

Но это же равносильно тому чтобы сделать
Код

int *mas[x];
for(int i=0; i<x; i++)
{
      int TempMas[i];
      mas[i] = TempMas
}

Тобишь я хотел статически определить двумерный массив с переменным числом элементов в каждой строке. Но да я както пропустил тот момент что к первому массиву обращаться можно только так NAME[i] получаем всю строку (адрес первого элемента строки которой храниться в NAME).
Ей богу не понимаю где я ошибаюсь :( Основательно запутался я.

Это сообщение отредактировал(а) cupper - 28.9.2010, 09:48
PM MAIL   Вверх
cupper
Дата 28.9.2010, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вот пример
Код

char *mas[2];
    int a1[] = {1, 2, 3, 4};
    int a2[] = {5, 6};
for(i=0; i<2; i++)
        printf("%d%c", *((*(mas+i))+1), (i == 1)?'\n':' ');

вывод: 2 6
вот так работает и так все понятно. А вот если пробовать делать
Код

char *mas[] = {{1,2,3,4}, {5,6}}

так массива не инициализаруется как предполагалось (могу предположить что из за того что в mas[] кладется не адрес массивов {1, 2, 3,4} и их элементы)
но для
Код

char *mas[] = {"test", "udertest"}

так работает.
Может кто нить объяснить в чем разница ? И возможно объявить не динамический двумерный массив с переменным числом элементов в строках не типа char* ??? 
Заранее благодарю за обширный ответ smile
PM MAIL   Вверх
Crafty
Дата 29.9.2010, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



cupper, мне кажется вы не видите разницу между массивом символов и указателем на символьную константу. Почитайте K&R повнимательней.
K&R:
Цитата

Между следующими двумя определениями есть важное различие: 
Код

char amessage[] = "now is the time"; /* массив */ 
char *pmessage = "now is the time"; /* указатель */ 

В первом из них amessage — это массив, ровно такой длины, чтобы в него  
поместилась инициализирующая строка символов и завершающий ' \ 0 '. Отдельные символы 
в строке можно изменять, но переменная amessage всегда будет указывать на один и 
тот же участок памяти. А вот pmessage — это указатель, который после инициализации 
указывает на строковую константу; впоследствии этот указатель можно изменить так, 
чтобы он указывал в другое место, но попытка изменить содержимое строки после этого даст неопределенный резудьтат.


PM MAIL   Вверх
cupper
Дата 29.9.2010, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



спасибо что уделяете мне время, но нам нужно уточнить не которые вещи, а то толи мы говорим с вами о разном толи я вас очен сильно не понимаю.

Я понимаю разнице между массивом и указателем на массив. 

Код

char *mas[] = {"test", "udertest"}

Здесь  объявлен массив указателей на строки, что можно понимать как двумерный массив.
Запись вида "test" это сокращенная запись {'t', 'e', 's', 't', '\0'}
по крайней мере в тоже K&R так написано для случай инициализации одномерного массива
Код

char mas[] = "test"
// является более компактной записью
char mas[] = {'t', 'e', 's', 't', '\0'}

Из чего у меня и сложилось выше написанное заключение что "test"  = {'t', 'e', 's', 't', '\0'}
Но в случае с указателями "test"  != {'t', 'e', 's', 't', '\0'}, потому что
Код

char *pmas = "test"  // верно
char *pmas = {'t', 'e', 's', 't', '\0'} // неверно

что меня приводит в замешательство. 
Все что выше написано в теме сводиться к этой проблеме.
PM MAIL   Вверх
Crafty
Дата 29.9.2010, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(cupper @  29.9.2010,  15:31 Найти цитируемый пост)
Я понимаю разнице между массивом и указателем на массив. 

Только я писал про:
Цитата(Crafty @  29.9.2010,  10:24 Найти цитируемый пост)
между массивом символов и указателем на символьную константу

Прочитайте еще раз цитату из K&R в моём предыдущем посте, и в осбенности последнюю фразу.
Цитата(cupper @  29.9.2010,  15:31 Найти цитируемый пост)
Здесь  объявлен массив указателей на строки, что можно понимать как двумерный массив.

Код

char *mas[] = {"test", "udertest"}

Это одномерный массив указателей на символьные константы, и в этом массиве храняться только адреса на первый элемент символьной константы.


Это сообщение отредактировал(а) Crafty - 29.9.2010, 15:00
PM MAIL   Вверх
Earnest
Дата 29.9.2010, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(cupper @  29.9.2010,  15:31 Найти цитируемый пост)
Здесь  объявлен массив указателей на строки, что можно понимать как двумерный массив.

Вовсе нет, это совершенно разные вещи. Двумерный массив - это массив, элементами которого являются массивы, причем фиксированной длины. И память эта непрерывна, чего нельзя сказать о массиве указателей.


--------------------
...
PM   Вверх
cupper
Дата 29.9.2010, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



чем массив символов отличается от массива чисел ? (кроме типов элементов char и int)
чем указатель на что либо отличается от указателя на символьную константу ?(кроме того что указательно на символьную константу знает что он указывает на символьную константу)
чем символьная константа отличается от константного массива типа char ? (кроме формы объявления)

Ответ: ничем.
Так в чем разница между тем что сказал я и тем что повторяете вы ?

Что такое двумерный массив ? Это массив массивов, тогда чем массив указателей на строки (символьные константы если вам так приятней) отличается от массива int mas[3][4] ? Только тем что последний в памяти храниться последовательно строка за строкой (таким образом к любому элементу массива можно обращаться так *(mas+3*i+j), а char *mas[] = {"aaa", "bbb"}, храниться в разброс (но при этом к любому их его элементов можно обращаться также как и в предыдущем случае mas[i][j] (в случае с указателями *((*(mas+i))+j) из за того что он храниться не в виде последовательности строк)

Если вам (может оно и вправду тольк так) приятно называть *mas[] именно только как массив указателей на символьные константы, и ни в коем случае ни двумерный массив (или масив указателей на строки), то давайте называть его так, а то уже второй пост мы спорим о том как я его называю, обходя непосредственно ту проблему на которой сконцентрирован весь топик).

Цитата

Вовсе нет, это совершенно разные вещи. Двумерный массив - это массив, элементами которого являются массивы, причем фиксированной длины. И память эта непрерывна, чего нельзя сказать о массиве указателей.

хорошо, не правильно терминологию использовал.

PS. тогда остается только один вопрос
Цитата

Запись вида "test" это сокращенная запись {'t', 'e', 's', 't', '\0'} для случая инициализации одномерного массива
Код

char mas[] = "test"
// является более компактной записью
char mas[] = {'t', 'e', 's', 't', '\0'}

Из чего у меня и сложилось выше написанное заключение что "test"  =  {'t', 'e', 's', 't', '\0'}
Но в случае с указателями "test"  != {'t', 'e', 's', 't', '\0'}, потому что
Код

char *pmas = "test"  // верно
char *pmas = {'t', 'e', 's', 't', '\0'} // неверно

что меня приводит в замешательство. 


и сори за бессмысленный треп.

Это сообщение отредактировал(а) cupper - 29.9.2010, 15:35
PM MAIL   Вверх
Master01
Дата 29.9.2010, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



вот что написано в "Язык Программирования С++. Спецальное издание." Б. Страуструп. Глава 5.2.2 "Строковые литералы."

"... Строковый литерал можно присвоить переменной типа char*. Это разрешается потому что в предыдущих определениях С и С++ типом строкового литерала был char*. Благодаря такому разрешению миллионы строк кода на С и С++ остаются синтаксически корректными...."

строковый литерал - это ваш "test" из предыдущего сообщения.

Выходит, что это очередной special case для обеспечения обратной совместимости. 

Насколько я понял, ошибка в рассуждениях выше в том, что вы считали строковый литерал некой сокращённой формой записи для массивов. Хотя это формально и так, но распространяется только на char, и как справедливо было установленно, к числовым массивам не применимо.

Добавлено через 5 минут и 46 секунд
это я к тому, что запись char *mas[] есть массив указателей на char, каждому из которых присваивается сроковый литерал.
PM MAIL   Вверх
cupper
Дата 30.9.2010, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Выходит, что это очередной special case для обеспечения обратной совместимости. 
Насколько я понял, ошибка в рассуждениях выше в том, что вы считали строковый литерал некой сокращённой формой записи для массивов. Хотя это формально и так, но распространяется только на char, и как справедливо было установленно, к числовым массивам не применимо.


Спасибо, я примерно так и думал, хотелось чтоб ктонибудь подтвердил мои догадки.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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