![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
rp80 |
![]()
Сообщение
#1
|
Студент ![]() Группа: Участник Сообщений: 36 Регистрация: 10.9.2011 Пользователь №: 2860 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Упражнения из страуструпа. Подскажите пожалуйста все ли тут верно?
И еще 1 вопрос. Можно ли инициализировать тип typedef int* PT[] не списком не инициализации? Пример:
Спасибо. |
|
|
![]() |
Iron Bug |
![]()
Сообщение
#2
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
Цитата //Указатель на массив из 7 указателей на целые typedef int* P7PAint[7]; это неверно. во втором случае: так делать нельзя, ибо размер массива должен быть константным. компилятор заранее не знает его и требует точного размера. new int*[10] даёт указатель на массив указателей на int (тип int **), а PT - массив указателей. тут просто несоответствие типов, потому что указатель нельзя привести к массиву, можно только наоборот: адрес массива привести к указателю. это связано с выделением памяти компилятором: массивы хранятся в памяти строго последовательно и компилятор должен точно знать размер объекта. у указателя этого размера нет. определение PT pt3[10] пытается создать массив из 10 элементов типа PT, но размер каждого элемента неизвестен заранее, а и компилятор просто не может выделить память под такой массив. Сообщение отредактировал Iron Bug - 27.10.2011, 7:08 |
|
|
Алексей1153 |
![]()
Сообщение
#3
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
Цитата //Указатель на массив из 7 указателей на целые typedef int* P7PAint[7]; не, вот так будет правильно:
Сообщение отредактировал Алексей1153 - 27.10.2011, 7:09 |
|
|
Iron Bug |
![]()
Сообщение
#4
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Алексей1153 |
![]()
Сообщение
#5
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
ну да, звёздочка лишняя
|
|
|
Iron Bug |
![]()
Сообщение
#6
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Алексей1153 |
![]()
Сообщение
#7
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
Iron Bug, скобки - ну нафиг, начинается путаница с объявлением функции вечно ) А я - за простоту и читаемость
предпочитаю определить лесенку понятных типов, чем корявую многоэтажку |
|
|
Iron Bug |
![]()
Сообщение
#8
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
предпочитаю определить лесенку понятных типов, чем корявую многоэтажку это НЕ лесенка. массив указателей и указатель на массив никак не связаны меж собой. это просто разные типы. и лесенка тут совершенно никуда не упирается. единственный способ определить указатель на массив - использовать скобки. потому что приоритет оператора [] выше приоритета взятия значения указателя * Сообщение отредактировал Iron Bug - 27.10.2011, 8:52 |
|
|
Алексей1153 |
![]()
Сообщение
#9
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
а, ты про квадратные скобки ))
ну если честно, я не пользуюсь такими типами, как type[] , у меня только указатели. И я сейчас путаюсь с непривычки под лесенкой я подразумеваю следующее: не городить в одну строчку указатель на тип-перетип, а определить конкретный тип, а затем массив элементов этого типа, либо массив указателей на этот тип. Но вот квадратных скобок в определении типа typedef у меня точно не будет Цитата единственный способ определить указатель на массив нифига подобного: int** pp; //указатель на массив указателей на int |
|
|
Iron Bug |
![]()
Сообщение
#10
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
а, ты про квадратные скобки )) нет. про круглые. и про определения массивов указателей и указателей на массивы. и лесенки тут ни при чём. int** pp; //указатель на массив указателей на int это указатель без фиксированного размера. а разговор идёт про массивы, которые называют array. компилятор с ними совсем по-другому работает. это массивы с фиксированным размером, создаваемые в стеке. и они определяются только через скобки. указатели приводятся только в одну сторону: от фиксированных к динамическим, но не наоборот. иногда имеет смысл применять фиксированные (это быстрее). Сообщение отредактировал Iron Bug - 27.10.2011, 9:31 |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 22.6.2025, 20:49 |