![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
Алексей1153 |
![]()
Сообщение
#11
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2944 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
Iron Bug, а покажи пример с круглыми, когда это не будет похоже на объявление типа указателя на функцию, я что-то в сомнениях ))
а небольшие массивы на стеке иногда использую, но работаю с ними через указатель и размер массива. Привычнее и нагляднее ) |
|
|
rp80 |
![]()
Сообщение
#12
|
Студент ![]() Группа: Участник Сообщений: 36 Регистрация: 10.9.2011 Пользователь №: 2860 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата //Указатель на массив из 7 указателей на целые typedef int* P7PAint[7]; это неверно. Спасибо за ответ. Но смотри. Первая строчка "Указатель на массив чар". char* PARChar;. У тебя возражений не вызвала. Предыдущее задание было массив чар(я не стал его писать из-за очевидности). Там, соответственно, такое же объявление: char* PChar; Ну а далее ведь тоже самое.
Если последнее верно, не мог бы ты разжевать что именно происходит здесь с расставлением скобок? во втором случае: так делать нельзя, ибо размер массива должен быть константным. компилятор заранее не знает его и требует точного размера. new int*[10] даёт указатель на массив указателей на int (тип int **), а PT - массив указателей. тут просто несоответствие типов, потому что указатель нельзя привести к массиву, можно только наоборот: адрес массива привести к указателю. это связано с выделением памяти компилятором: массивы хранятся в памяти строго последовательно и компилятор должен точно знать размер объекта. у указателя этого размера нет. определение PT pt3[10] пытается создать массив из 10 элементов типа PT, но размер каждого элемента неизвестен заранее, а и компилятор просто не может выделить память под такой массив. Здесь вроде дошло наконец.. Спасибо int* (*P7PAint)[7]=&P7Aint[7]; Только вот так, конечно. Тогда и "Указатель на массив чар" надо, по идее определять так: char c[5]; char (*pc)[5]=&c; |
|
|
Iron Bug |
![]()
Сообщение
#13
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
Про скобки:
Приоритет оператора [] выше приоритета *. Поэтому выражение
означает массив из семи указателей на int. Фактически получается int (*(P7PAint[7])) (скобки расставлены так, как это воспринимает компилятор). Начинаем разворачивать скобки, начиная с наружних. Получается, что выражение *P7PAint[7] есть int. Далее, выражение P7PAint[7] есть int*. То есть, каждый элемент P7PAint имеет тип int* - указатель на тип int. Чтобы объявить указатель на массив, нужно указать компилятору, чего мы хотим, и расставить приоритеты:
Вот теперь это один указатель на массив из семи int-ов. То есть, приритеты выглядят так: int ((*P7PAint)[7]). Это означает, что (*P7PAint)[7] имеет тип int (каждый элемент массива (*P7PAint)[7] есть целое число), то есть, *P7PAint имеет тип int[7] . То есть, P7PAint есть указатель на массив из 7 элементов типа int, что и требовалось. да, кстати: при указателе на массив на стеке (определённый через []) размер массива должен быть явно указан. потому что выражение int (*foo)[] в общем смысле не может быть размещено компилятором как самостоятельный объект в памяти. его можно использовать только как указатель на уже готовую структуру данных, например, как-то так:
но это вряд ли принесёт особую выгоду, ибо тут можно просто запутаться. Сообщение отредактировал Iron Bug - 27.10.2011, 12:49 |
|
|
rp80 |
![]()
Сообщение
#14
|
Студент ![]() Группа: Участник Сообщений: 36 Регистрация: 10.9.2011 Пользователь №: 2860 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Все понятно, наконец, спасибо.
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 11.7.2025, 3:39 |